Puoi sempre trasformare una funzione ricorsiva in una funzione iterativa? Sì, assolutamente, e la tesi di Church-Turing lo dimostra se la memoria serve. In termini laici, afferma che ciò che è calcolabile dalle funzioni ricorsive è calcolabile da un modello iterativo (come la macchina di Turing) e viceversa. La tesi non ti dice esattamente come fare la conversione, ma dice che è sicuramente possibile.
In molti casi, convertire una funzione ricorsiva è semplice. Knuth offre diverse tecniche in "The Art of Computer Programming". E spesso, una cosa calcolata in modo ricorsivo può essere calcolata con un approccio completamente diverso in meno tempo e spazio. Il classico esempio di ciò sono i numeri di Fibonacci o le loro sequenze. Hai sicuramente incontrato questo problema nel tuo piano di studi.
Sul rovescio della medaglia, possiamo certamente immaginare un sistema di programmazione così avanzato da trattare una definizione ricorsiva di una formula come un invito a memorizzare i risultati precedenti, offrendo così il vantaggio di velocità senza il fastidio di dire esattamente al computer quali passi per seguire nel calcolo di una formula con una definizione ricorsiva. Dijkstra quasi certamente immaginava un tale sistema. Ha trascorso molto tempo cercando di separare l'implementazione dalla semantica di un linguaggio di programmazione. Inoltre, i suoi linguaggi di programmazione non deterministici e multiprocessore sono in una lega superiore al programmatore professionista praticante.
In ultima analisi, molte funzioni sono semplicemente più facili da capire, leggere e scrivere in forma ricorsiva. A meno che non ci sia un motivo convincente, probabilmente non dovresti (manualmente) convertire queste funzioni in un algoritmo esplicitamente iterativo. Il tuo computer gestirà quel lavoro correttamente.
Vedo un motivo convincente. Supponiamo di avere un prototipo di sistema in un linguaggio di altissimo livello come [ indossare biancheria intima di amianto ] Scheme, Lisp, Haskell, OCaml, Perl o Pascal. Supponiamo che le condizioni siano tali da richiedere un'implementazione in C o Java. (Forse è politica.) Quindi potresti sicuramente avere alcune funzioni scritte in modo ricorsivo ma che, tradotte letteralmente, farebbero esplodere il tuo sistema di runtime. Ad esempio, in Scheme è possibile la ricorsione infinita della coda, ma lo stesso linguaggio causa un problema per gli ambienti C esistenti. Un altro esempio è l'uso di funzioni nidificate lessicali e ambito statico, che Pascal supporta ma C no.
In queste circostanze, potresti provare a superare la resistenza politica alla lingua originale. Potresti ritrovarti a reimplementare male Lisp, come nella decima legge di Greenspun. Oppure potresti trovare un approccio completamente diverso alla soluzione. Ma in ogni caso, c'è sicuramente un modo.