Simplement dit, la récurrence finale est une récurrence dans laquelle le compilateur pourrait remplacer l'appel récursif par une commande "goto", de sorte que la version compilée n'aura pas à augmenter la profondeur de la pile.
Parfois, la conception d’une fonction queue récursive nécessite la création d’une fonction d’aide avec des paramètres supplémentaires.
Par exemple, ce n'est pas une fonction queue-récursive:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Mais ceci est une fonction queue-récursive:
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;
}
parce que le compilateur pourrait réécrire la fonction récursive en une fonction non récursive, en utilisant quelque chose comme ceci (un pseudocode):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
La règle pour le compilateur est très simple: lorsque vous trouvez " return thisfunction(newparameters);
", remplacez-le par " parameters = newparameters; goto start;
". Mais cela ne peut être fait que si la valeur renvoyée par l'appel récursif est renvoyée directement.
Si tous les appels récursifs dans une fonction peuvent être remplacés de la sorte, il s’agit d’une fonction récursive.