Können Sie eine rekursive Funktion immer in eine iterative umwandeln? Ja, absolut, und die Church-Turing-These beweist es, wenn das Gedächtnis dient. In Laien ausgedrückt heißt es, dass das, was durch rekursive Funktionen berechenbar ist, durch ein iteratives Modell (wie die Turing-Maschine) berechenbar ist und umgekehrt. Die These sagt Ihnen nicht genau, wie Sie die Konvertierung durchführen sollen, aber sie besagt, dass dies definitiv möglich ist.
In vielen Fällen ist das Konvertieren einer rekursiven Funktion einfach. Knuth bietet verschiedene Techniken in "The Art of Computer Programming" an. Und oft kann eine rekursiv berechnete Sache durch einen völlig anderen Ansatz in weniger Zeit und Raum berechnet werden. Das klassische Beispiel hierfür sind Fibonacci-Zahlen oder Sequenzen davon. Sie haben dieses Problem sicherlich in Ihrem Studienplan getroffen.
Auf der anderen Seite dieser Medaille können wir uns sicherlich ein Programmiersystem vorstellen, das so fortschrittlich ist, dass es eine rekursive Definition einer Formel als Aufforderung behandelt, sich frühere Ergebnisse zu merken, und so den Geschwindigkeitsvorteil bietet, ohne dem Computer genau sagen zu müssen, zu welchen Schritten er vorgehen soll Folgen Sie der Berechnung einer Formel mit einer rekursiven Definition. Dijkstra hat sich mit ziemlicher Sicherheit ein solches System vorgestellt. Er hat lange versucht, die Implementierung von der Semantik einer Programmiersprache zu trennen. Andererseits sind seine nicht deterministischen und mehrverarbeitenden Programmiersprachen in einer Liga über dem praktizierenden professionellen Programmierer.
Letztendlich sind viele Funktionen in rekursiver Form einfach einfacher zu verstehen, zu lesen und zu schreiben. Sofern es keinen zwingenden Grund gibt, sollten Sie diese Funktionen wahrscheinlich nicht (manuell) in einen explizit iterativen Algorithmus konvertieren. Ihr Computer wird diesen Job korrekt ausführen.
Ich kann einen zwingenden Grund sehen. Angenommen, Sie haben ein Prototypsystem in einer Sprache auf höchstem Niveau wie [ Asbestunterwäsche anziehen ], Lisp, Haskell, OCaml, Perl oder Pascal. Angenommen, die Bedingungen sind so, dass Sie eine Implementierung in C oder Java benötigen. (Vielleicht ist es Politik.) Dann könnten Sie sicherlich einige Funktionen rekursiv schreiben lassen, die aber wörtlich übersetzt Ihr Laufzeitsystem explodieren lassen würden. Beispielsweise ist in Schema eine unendliche Schwanzrekursion möglich, aber dieselbe Redewendung verursacht ein Problem für vorhandene C-Umgebungen. Ein weiteres Beispiel ist die Verwendung von lexikalisch verschachtelten Funktionen und statischen Bereichen, die Pascal unterstützt, C jedoch nicht.
Unter diesen Umständen könnten Sie versuchen, den politischen Widerstand gegen die Originalsprache zu überwinden. Sie könnten feststellen, dass Sie Lisp schlecht umsetzen, wie im zehnten Gesetz von Greenspun (ironisch). Oder Sie finden einfach einen völlig anderen Lösungsansatz. Aber auf jeden Fall gibt es einen Weg.