Pouvez-vous toujours transformer une fonction récursive en une fonction itérative? Oui, absolument, et la thèse de Church-Turing le prouve si la mémoire est bonne. En termes simples, il déclare que ce qui est calculable par des fonctions récursives est calculable par un modèle itératif (tel que la machine de Turing) et vice versa. La thèse ne vous dit pas précisément comment faire la conversion, mais elle dit que c'est certainement possible.
Dans de nombreux cas, la conversion d'une fonction récursive est facile. Knuth propose plusieurs techniques dans "L'art de la programmation informatique". Et souvent, une chose calculée récursivement peut être calculée par une approche complètement différente en moins de temps et d'espace. L'exemple classique de ceci est les nombres de Fibonacci ou leurs séquences. Vous avez sûrement rencontré ce problème dans votre plan d'études.
De l'autre côté de cette médaille, on peut certainement imaginer un système de programmation suffisamment avancé pour traiter une définition récursive d'une formule comme une invitation à mémoriser des résultats antérieurs, offrant ainsi l'avantage de la vitesse sans avoir à dire à l'ordinateur exactement quelles étapes à suivre suivre dans le calcul d'une formule avec une définition récursive. Dijkstra a presque certainement imaginé un tel système. Il a passé un long moment à essayer de séparer l'implémentation de la sémantique d'un langage de programmation. Là encore, ses langages de programmation non déterministes et multiprocesseurs sont dans une ligue au-dessus du programmeur professionnel en exercice.
En dernière analyse, de nombreuses fonctions sont tout simplement plus faciles à comprendre, à lire et à écrire sous forme récursive. À moins qu'il n'y ait une raison impérieuse, vous ne devriez probablement pas (manuellement) convertir ces fonctions en un algorithme explicitement itératif. Votre ordinateur gérera ce travail correctement.
Je peux voir une raison convaincante. Supposons que vous ayez un système prototype dans un langage de très haut niveau comme [ enfiler des sous-vêtements en amiante ] Scheme, Lisp, Haskell, OCaml, Perl ou Pascal. Supposons que les conditions soient telles que vous ayez besoin d'une implémentation en C ou Java. (C'est peut-être de la politique.) Alors vous pourriez certainement avoir des fonctions écrites récursivement mais qui, traduites littéralement, feraient exploser votre système d'exécution. Par exemple, la récursivité infinie de la queue est possible dans Scheme, mais le même idiome pose un problème pour les environnements C existants. Un autre exemple est l'utilisation de fonctions imbriquées lexicalement et de portée statique, que Pascal prend en charge mais pas C.
Dans ces circonstances, vous pourriez essayer de surmonter la résistance politique à la langue d'origine. Vous pourriez vous retrouver à réimplémenter mal Lisp, comme dans la dixième loi de Greenspun (ironique). Ou vous pourriez simplement trouver une approche complètement différente de la solution. Mais en tout cas, il y a sûrement un moyen.