Простіше кажучи, хвоста рекурсія - це рекурсія, де компілятор міг би замінити рекурсивний виклик командою "goto", тому компільована версія не повинна збільшувати глибину стека.
Іноді для проектування хвостово-рекурсивної функції потрібно створити допоміжну функцію з додатковими параметрами.
Наприклад, це не хвостово-рекурсивна функція:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Але це хвоста-рекурсивна функція:
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;
}
тому що компілятор може переписати рекурсивну функцію на нерекурсивну, використовуючи щось подібне (псевдокод):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
Правило для компілятора дуже просте: коли ви знайдете " return thisfunction(newparameters);
", замініть його на " parameters = newparameters; goto start;
". Але це можна зробити, лише якщо значення, повернене рекурсивним викликом, повернеться безпосередньо.
Якщо всі рекурсивні виклики у функції можуть бути замінені так, то це хвоста-рекурсивна функція.