Einfach gesagt, ist die Schwanzrekursion eine Rekursion, bei der der Compiler den rekursiven Aufruf durch einen "goto" -Befehl ersetzen könnte, sodass die kompilierte Version die Stapeltiefe nicht erhöhen muss.
Manchmal müssen Sie zum Entwerfen einer rekursiven Endfunktion eine Hilfsfunktion mit zusätzlichen Parametern erstellen.
Dies ist beispielsweise keine Schwanzrekursivfunktion:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Dies ist jedoch eine schwanzrekursive Funktion:
int factorial(int x) {
return tailfactorial(x, 1);
}
int tailfactorial(int x, int multiplier) {
if (x > 0) {
return tailfactorial(x - 1, x * multiplier);
}
return multiplier;
}
weil der Compiler die rekursive Funktion in eine nicht rekursive Funktion umschreiben könnte, indem er so etwas wie diesen (einen Pseudocode) verwendet:
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
Die Regel für den Compiler ist sehr einfach: Wenn Sie " return thisfunction(newparameters);
" finden, ersetzen Sie sie durch " parameters = newparameters; goto start;
". Dies ist jedoch nur möglich, wenn der vom rekursiven Aufruf zurückgegebene Wert direkt zurückgegeben wird.
Wenn alle rekursiven Aufrufe in einer Funktion auf diese Weise ersetzt werden können, handelt es sich um eine rekursive Endfunktion.