Secara sederhana, rekursi ekor adalah rekursi di mana kompiler dapat mengganti panggilan rekursif dengan perintah "goto", sehingga versi yang dikompilasi tidak harus meningkatkan kedalaman tumpukan.
Kadang-kadang merancang fungsi rekursif ekor mengharuskan Anda perlu membuat fungsi pembantu dengan parameter tambahan.
Sebagai contoh, ini bukan fungsi rekursif ekor:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Tapi ini adalah fungsi rekursif ekor:
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;
}
karena kompiler dapat menulis ulang fungsi rekursif ke yang non-rekursif, menggunakan sesuatu seperti ini (kodesemu):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
Aturan untuk kompiler sangat sederhana: Ketika Anda menemukan " return thisfunction(newparameters);
", ganti dengan " parameters = newparameters; goto start;
". Tetapi ini hanya dapat dilakukan jika nilai yang dikembalikan oleh panggilan rekursif dikembalikan secara langsung.
Jika semua panggilan rekursif dalam suatu fungsi dapat diganti seperti ini, maka itu adalah fungsi ekor-rekursif.