Au passage, on peut aussi faire récursivement le calcul de fib(n) en temps logarithmique (contre exponentiel par la méthode stupide consistant à traduire directement la définition). Ce qui est bien meilleur que la version itérative naïve, qui est linéaire.
L’idée de base, c’est que si on connaît x = fib(n) et y = fib(n+1), on peut en tirer fib(2n) et fib(2n+1).
Exercice : trouver les formules, qui dérivent du problème "calculer la puissance n-ieme de la matrice du message ci-dessus"
La conclusion, c’est que la programmation récursive ne donne pas par essence des programmes moins efficaces. Faut juste pas faire n’importe quoi avec, comme la programmation itérative.
Le problème c’est la manière souvent débile d’enseigner la récursivité :
- commencer par factorielle,
- 1.a concrètement personne n’a rien à péter de cette fonction. Erreur 1: faut donner des exemples motivants.
- 1.b dont la programmation itérative ne pose pas aucun problème, et est donc considérée comme la manière naturelle de faire (le produit des nombres de 1 à n => hop on fait une boucle de 1 à n). Erreur 2: aucune raison de se casser le cul à apprendre à faire autrement que ce qu’on sait déjà très bien faire
- Continuer par fibonacci naïf
- 2.a Tout le monde s’en fout de fibonacci (erreur 1 again)
- 2.b on l’a déjà fait en itératif (erreur 2 again)
- 2.c ça marche pas pour les "grandes" valeurs, temps de calcul exponentiel. Erreur 3 : se casser la baraque tout seul en montrant que le truc qu’on enseigne, ça fait pas le boulot.
On y rajoutera "oui mais quand ça marche, ça explose la pile", avec la fonction d’Ackerman.