Betrachten wir eine einfache Funktion, die die ersten N natürlichen Zahlen addiert. (z.B.. sum(5) = 0 + 1 + 2 + 3 + 4 + 5 = 15
).
Hier ist eine einfache JavaScript-Implementierung, die Rekursion verwendet:
function recsum(x) {
if (x === 0) {
return 0;
} else {
return x + recsum(x - 1);
}
}
Wenn Sie anrufen recsum(5)
würde der JavaScript-Interpreter dies auswerten:
recsum(5)
5 + recsum(4)
5 + (4 + recsum(3))
5 + (4 + (3 + recsum(2)))
5 + (4 + (3 + (2 + recsum(1))))
5 + (4 + (3 + (2 + (1 + recsum(0)))))
5 + (4 + (3 + (2 + (1 + 0))))
5 + (4 + (3 + (2 + 1)))
5 + (4 + (3 + 3))
5 + (4 + 6)
5 + 10
15
Beachten Sie, dass jeder rekursive Aufruf abgeschlossen sein muss, bevor der JavaScript-Interpreter die eigentliche Arbeit der Summenberechnung übernimmt.
Hier ist eine tail-rekursive Version der gleichen Funktion:
function tailrecsum(x, running_total = 0) {
if (x === 0) {
return running_total;
} else {
return tailrecsum(x - 1, running_total + x);
}
}
Hier die Abfolge der Ereignisse, die eintreten würden, wenn Sie tailrecsum(5)
(das wäre in Wirklichkeit tailrecsum(5, 0)
(wegen des standardmäßigen zweiten Arguments).
tailrecsum(5, 0)
tailrecsum(4, 5)
tailrecsum(3, 9)
tailrecsum(2, 12)
tailrecsum(1, 14)
tailrecsum(0, 15)
15
Im tail-rekursiven Fall wird bei jeder Auswertung des rekursiven Aufrufs die running_total
aktualisiert wird.
_Hinweis: In der ursprünglichen Antwort wurden Beispiele aus Python verwendet. Diese wurden in JavaScript geändert, da Python-Interpreter keine Unterstützung für Optimierung des Heckaufrufs . Die Optimierung von Schwanzaufrufen ist jedoch Teil der ECMAScript 2015 Spezifikation die meisten JavaScript-Interpreter es nicht unterstützen ._
22 Stimmen
Vielleicht ist es spät, aber dies ist ein ziemlich guter Artikel über Schwanz rekursiv: programmerinterview.com/index.php/rekursion/schwanz-rekursion
8 Stimmen
Einer der großen Vorteile der Identifizierung einer tail-rekursiven Funktion ist, dass sie in eine iterative Form umgewandelt werden kann und somit der Algorithmus vom Methoden-Stack-Overhead befreit wird. Vielleicht möchten Sie die Antwort von @Kyle Cronin und einigen anderen unten lesen
0 Stimmen
Dieser Link von @yesudeep ist die beste und ausführlichste Beschreibung, die ich gefunden habe - lua.org/pil/6.3.html
1 Stimmen
Könnte mir jemand sagen, ob Merge-Sortierung und Quick-Sortierung Tail-Rekursion (TRO) verwenden?
2 Stimmen
@majurageerthan - das hängt von der jeweiligen Implementierung dieser (und anderer) Algorithmen ab.
0 Stimmen
youtube.com/watch?v=-PX0BV9hGZY \=)
0 Stimmen
Hier gibt es eine sehr gute Erklärung dafür: youtu.be/KdlmSpjU-AE Die Tail-Rekursion finden Sie am Ende der Diskussion.