Simplemente dicho, la recursión de cola es una recursión en la que el compilador podría reemplazar la llamada recursiva con un comando "goto", por lo que la versión compilada no tendrá que aumentar la profundidad de la pila.
A veces, diseñar una función recursiva de cola requiere que necesite crear una función auxiliar con parámetros adicionales.
Por ejemplo, esta no es una función recursiva de cola:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Pero esta es una función recursiva de cola:
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;
}
porque el compilador podría reescribir la función recursiva a una no recursiva, usando algo como esto (un pseudocódigo):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
La regla para el compilador es muy simple: cuando encuentre " return thisfunction(newparameters);
", reemplácelo con " parameters = newparameters; goto start;
". Pero esto solo se puede hacer si el valor devuelto por la llamada recursiva se devuelve directamente.
Si todas las llamadas recursivas en una función se pueden reemplazar de esta manera, entonces es una función recursiva de cola.