Après qu'on ne s'y trompe pas. Je ne dis pas qu'il ne faut jamais utiliser de boucle. Juste que l'argument "non mais c'est lent le récursif" est abscons.
(.../...)Je crois que ce que tu n'as pas bien compris, c'est que le temps cerveau d'un développeur est une denrée rare, et que l'économiser est une bonne chose. Si notre développeur doit à un moment calculer la taille d'un arbre, il écrit en quelques secondes
Code:
1 2 3
| let rec height = function
| Leaf -> 0
|Node (l, _, r) -> 1 + max (height l) (height r) |
Et après il peut se concentrer sur ce qui compte vraiment, la structure de son projet, l'algorithme central dont il aimerait abaisser la complexité, se demander où il devrait ajouter un cache ou de la mémoization. Et si un jour son profiler lui dit qu'il passe trop de temps dans height, il sera grand temps de l'améliorer.
L'autre option est de se créer à la main une structure de backtrack, soit par inversion de pointeurs, soit avec une pile. Il y passera de longues minutes, voir heures, aura de bonnes chances de se tromper, et aura des performances identiques, et si meilleur, d'epsilon.(.../...)