Dies hängt von Ihrer Sichtweise ab.
Wenn Sie sich die Berechnungstheorie ansehen , sind Iteration und Rekursion gleichermaßen aussagekräftig . Das bedeutet, dass Sie eine Funktion schreiben können, die etwas berechnet, und es spielt keine Rolle, ob Sie es rekursiv oder iterativ tun, Sie können beide Ansätze wählen. Sie können nichts rekursiv berechnen, was Sie nicht iterativ berechnen können, und umgekehrt (obwohl die internen Abläufe des Programms möglicherweise unterschiedlich sind).
Viele Programmiersprachen behandeln Rekursion und Iteration aus gutem Grund nicht gleich. In der Regel bedeutet Rekursion, dass die Sprache / der Compiler den Aufrufstapel verarbeitet, und Iteration bedeutet, dass Sie möglicherweise die Stapelverarbeitung selbst durchführen müssen.
Es gibt jedoch Sprachen - insbesondere funktionale Sprachen -, in denen Dinge wie Schleifen (für, während) tatsächlich nur syntaktischer Zucker für die Rekursion sind und auf diese Weise hinter den Kulissen implementiert werden. Dies ist in funktionalen Sprachen oft wünschenswert, da sie normalerweise nicht das Konzept haben, eine Schleife zu bilden, und wenn sie dies hinzufügen, wird ihr Kalkül aus wenig praktischen Gründen komplexer.
Also nein, sie sind nicht an sich gleich . Sie sind gleichermaßen aussagekräftig , dh Sie können etwas nicht iterativ berechnen, Sie können es nicht rekursiv berechnen und umgekehrt, aber das ist es im Allgemeinen (gemäß der Church-Turing-These).
Beachten Sie, dass es sich hier um rekursive Programme handelt . Es gibt andere Formen der Rekursion, z. B. in Datenstrukturen (z. B. Bäume).
Wenn Sie es aus Sicht der Implementierung betrachten , sind Rekursion und Iteration ziemlich unterschiedlich. Bei der Rekursion wird für jeden Aufruf ein neuer Stapelrahmen erstellt. Jeder Schritt der Rekursion ist in sich abgeschlossen und bezieht die Argumente für die Berechnung vom Angerufenen (selbst).
Loops hingegen erzeugen keine Callframes. Für sie bleibt der Kontext nicht bei jedem Schritt erhalten. Für die Schleife springt das Programm lediglich zum Anfang der Schleife zurück, bis die Schleifenbedingung fehlschlägt.
Dies ist sehr wichtig zu wissen, da es in der realen Welt ziemlich radikale Unterschiede machen kann. Zur Rekursion muss bei jedem Aufruf der gesamte Kontext gespeichert werden. Bei der Iteration können Sie genau steuern, welche Variablen sich im Speicher befinden und was wo gespeichert wird.
Wenn Sie es so betrachten, werden Sie schnell feststellen, dass sich Iteration und Rekursion für die meisten Sprachen grundlegend unterscheiden und unterschiedliche Eigenschaften haben. Je nach Situation sind einige Eigenschaften wünschenswerter als andere.
Rekursion können Programme einfacher und leichter zu testen und machen Beweis . Das Konvertieren einer Rekursion in eine Iteration macht den Code in der Regel komplexer und erhöht die Wahrscheinlichkeit eines Fehlers. Auf der anderen Seite kann das Konvertieren in Iteration und Reduzieren der Anzahl der Call-Stack-Frames den dringend benötigten Speicherplatz einsparen.