Recentemente sono entrato nella programmazione funzionale. Ho fatto una domanda qui sopra "'Memorizzare' i valori nella programmazione funzionale" e ho imparato un sacco di cose che non avevo nemmeno capito che volevo ancora imparare. È stato molto utile Mi ha lasciato alcune nuove domande senza risposta. Il primo di questi è, quando dovrei effettivamente ricorrere alla ricorsione in coda?
Nel mio esempio, l'ho usato inavvertitamente. Stavo usando una funzione di esempio per aumentare xey; x ^ y.
Ci sono due modi principali in cui ciò può essere fatto. Un modo ricorsivo non coda, come segue:
(il seguente è tutto codificato in pseudocodice)
f(x,y){
if y > 1,
return x * f(x,y-1);
else
return x;
}
Ma come alternativa alla ricorsione in coda, potrei farlo in questo modo:
f(x,y,z){
if z == 'null',
f(x,y,x);
else if y > 1,
f(x*z,y-1,z);
else
return x;
}
Entrambi funzionano bene, ma dal momento che il primo è ricorsivo non di coda, potrebbe teoricamente rimanere bloccato su operazioni particolarmente grandi. Tuttavia, anche se questo è il caso, farlo senza ricorsione di coda solo si sente più pulito. Non ho bisogno di usare un argomento in più, e il mio codice sembra molto "mistico". Dopo tutto, return x * f (x, y-1) è solo un altro modo per dire return x * x ^ y-1.
Immagino che cosa mi stia chiedendo, ci sono momenti in cui non dovrei usare la ricorsione della coda? Esiste un codice che è meglio lasciare senza ricorsione, o dovrei semplicemente prendere l'abitudine di ricorrere a tutte le funzioni quando applicabile?