TL; DR: i linguaggi funzionali gestiscono la ricorsione meglio di quelli non funzionali?
Attualmente sto leggendo il codice completo 2. Ad un certo punto del libro, l'autore ci mette in guardia sulla ricorsione. Dice che dovrebbe essere evitato quando possibile e che le funzioni che utilizzano la ricorsione sono generalmente meno efficaci di una soluzione che utilizza i loop. Ad esempio, l'autore ha scritto una funzione Java utilizzando la ricorsione per calcolare il fattoriale di un numero come questo (potrebbe non essere esattamente lo stesso poiché non ho il libro con me al momento):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Questo è presentato come una cattiva soluzione. Tuttavia, nei linguaggi funzionali, l'uso della ricorsione è spesso il modo preferito di fare le cose. Ad esempio, ecco la funzione fattoriale in Haskell che utilizza la ricorsione:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Ed è ampiamente accettato come una buona soluzione. Come ho visto, Haskell usa la ricorsione molto spesso, e non ho visto da nessuna parte che sia disapprovato.
Quindi la mia domanda è fondamentalmente:
- I linguaggi funzionali gestiscono la ricorsione meglio di quelli non funzionali?
EDIT: Sono consapevole che gli esempi che ho usato non sono i migliori per illustrare la mia domanda. Volevo solo sottolineare che Haskell (e i linguaggi funzionali in generale) usano la ricorsione molto più spesso dei linguaggi non funzionali.