Detto semplicemente, la ricorsione della coda è una ricorsione in cui il compilatore potrebbe sostituire la chiamata ricorsiva con un comando "goto", quindi la versione compilata non dovrà aumentare la profondità dello stack.
A volte la progettazione di una funzione ricorsiva della coda richiede la necessità di creare una funzione di supporto con parametri aggiuntivi.
Ad esempio, questa non è una funzione ricorsiva della coda:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
Ma questa è una funzione ricorsiva della coda:
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;
}
perché il compilatore potrebbe riscrivere la funzione ricorsiva in una non ricorsiva, usando qualcosa del genere (uno pseudocodice):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
La regola per il compilatore è molto semplice: quando trovi " return thisfunction(newparameters);
", sostituiscilo con " parameters = newparameters; goto start;
". Ma questo può essere fatto solo se il valore restituito dalla chiamata ricorsiva viene restituito direttamente.
Se tutte le chiamate ricorsive in una funzione possono essere sostituite in questo modo, si tratta di una funzione ricorsiva della coda.