Dito de forma simples, a recursão da cauda é uma recursão em que o compilador pode substituir a chamada recursiva por um comando "goto", para que a versão compilada não precise aumentar a profundidade da pilha.
Às vezes, projetar uma função recursiva de cauda exige que você precise criar uma função auxiliar com parâmetros adicionais.
Por exemplo, esta não é uma função recursiva da cauda:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Mas esta é uma função recursiva da cauda:
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 o compilador pode reescrever a função recursiva para uma função não recursiva, usando algo como isto (um pseudocódigo):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
A regra para o compilador é muito simples: quando você encontrar " return thisfunction(newparameters);
", substitua-o por " parameters = newparameters; goto start;
". Mas isso pode ser feito apenas se o valor retornado pela chamada recursiva for retornado diretamente.
Se todas as chamadas recursivas em uma função puderem ser substituídas assim, é uma função recursiva de cauda.