TL; DR: ¿Los lenguajes funcionales manejan la recursividad mejor que los no funcionales?
Actualmente estoy leyendo Code Complete 2. En algún momento del libro, el autor nos advierte sobre la recurrencia. Él dice que debe evitarse cuando sea posible y que las funciones que usan recursividad son generalmente menos efectivas que una solución que usa bucles. Como ejemplo, el autor escribió una función de Java usando la recursión para calcular el factorial de un número como este (puede que no sea exactamente lo mismo ya que no tengo el libro conmigo en este momento):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Esto se presenta como una mala solución. Sin embargo, en lenguajes funcionales, el uso de la recursión es a menudo la forma preferida de hacer las cosas. Por ejemplo, aquí está la función factorial en Haskell usando recursividad:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Y es ampliamente aceptado como una buena solución. Como he visto, Haskell usa la recursión muy a menudo, y no vi en ninguna parte que esté mal visto.
Entonces mi pregunta es básicamente:
- ¿Los lenguajes funcionales manejan la recursividad mejor que los no funcionales?
EDITAR: Soy consciente de que los ejemplos que utilicé no son los mejores para ilustrar mi pregunta. Solo quería señalar que Haskell (y los lenguajes funcionales en general) usan la recursión con mucha más frecuencia que los lenguajes no funcionales.
factorial n = product [1..n]
es más sucinto, más eficiente y no desborda la pila en grande n
(y si necesita memorización, se requieren opciones completamente diferentes). product
se define en términos de algunos fold
, que se define de forma recursiva, pero con extremo cuidado. La recursión es una solución aceptable la mayor parte del tiempo, pero aún así es fácil hacerlo mal / subóptimo.