Der beste Weg für mich zu verstehen tail call recursion
ist ein Spezialfall der Rekursion, bei dem die letzter Aufruf (oder der Tail Call) ist die Funktion selbst.
Vergleich der in Python bereitgestellten Beispiele:
def recsum(x):
if x == 1:
return x
else:
return x + recsum(x - 1)
^RECURSION
def tailrecsum(x, running_total=0):
if x == 0:
return running_total
else:
return tailrecsum(x - 1, running_total + x)
^SCHWANZ-REKURSION
Wie Sie in der allgemeinen rekursiven Version sehen können, lautet der letzte Aufruf im Codeblock x + recsum(x - 1)
. Nach dem Aufruf der recsum
Methode gibt es einen weiteren Vorgang, der x + ..
.
In der Tail-Rekursiv-Version ist der letzte Aufruf (oder der Tail-Aufruf) im Codeblock jedoch tailrecsum(x - 1, running_total + x)
was bedeutet, dass der letzte Aufruf an die Methode selbst erfolgt und danach keine Operation mehr.
Dieser Punkt ist wichtig, weil die Tail-Rekursion, wie hier zu sehen, den Speicher nicht wachsen lässt, denn wenn die zugrunde liegende VM sieht, dass eine Funktion sich selbst an einer Tail-Position aufruft (der letzte Ausdruck, der in einer Funktion ausgewertet wird), beseitigt sie den aktuellen Stack-Frame, was als Tail Call Optimization (TCO) bekannt ist.
EDIT
NB. Bitte bedenken Sie, dass das obige Beispiel in Python geschrieben ist, dessen Laufzeitumgebung TCO nicht unterstützt. Dies ist nur ein Beispiel, um den Punkt zu erklären. TCO wird in Sprachen wie Scheme, Haskell usw. unterstützt.
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.