Prolongements sur la complexité

I. La fonction d'Ackermann

La fonction d'Ackermann est un exemple classique de fonction récursive qui "explose" très vite. Vous pouvez la tester grâce au fichier complexiteAckermann.py. Pour plus d'informations, voir la page qui y est consacrée sur Wikipedia. La définition de la fonction Ackermann est la suivante :

A(0, n) = n + 1
A(m, 0) = A(m-1, 1) si m > 0
A(m, n) = A(m-1, A(m, n-1)) si m > 0 et n > 0

II. Efficacité des langages de programmation

Pour résoudre un problème efficacement, l'efficacité d'un langage de programmation passe bien sûr après le problème de la complexité, Surtout s'il s'agit de résoudre ponctuellement un gros problème. Mais s'il s'agit de résoudre fréquemment des problèmes de tailles petites à moyennes, la question est tout autre. À titre d'exemple, voici un extrait d'une comparaison publiée sur la page https://thenewstack.io/which-programming-languages-use-the-least-electricity/ :

Efficacité de langages de programmation
Langage Efficacité en temps
Efficacité en espace
C 1 1,17
Java 1,89 6,01
C# 3,14 2,85
swift 4,20 2,71
javascript 6,52 4,59
PHP
27,64 2,57
Python 71,90 2,80

III. Pour aller encore plus loin

L'étude de la complexité est un problème de recherche qui date des "débuts" de l'informatique et qui est encore d'actualité. En 1965, Juris Hartmanis et Richard E. Stearns définissent les premières classes de complexité. Voici une présentation rapide de quelques classes de complexité :

Il a été prouvé (démonstration triviale) que P ⊂ NP. Par contre, la question P = NP reste un problème ouvert.