estoy tratando de entender la recursividad de cola en Haskell. Creo que entiendo de qué se trata y cómo funciona, pero me gustaría asegurarme de no estropear las cosas.recursión de cola en Haskell
Aquí es el "estándar" definición de factorial:
factorial 1 = 1
factorial k = k * factorial (k-1)
Cuando se ejecuta, por ejemplo, factorial 3
, mi función asume el nombre de 3 veces (darle más o menos). Esto podría plantear un problema si quisiera calcular factorial 99999999 ya que podría tener un desbordamiento de pila. Después llego a factorial 1 = 1
voy a tener que "volver" en la pila y multiplicar todos los valores, por lo que tengo 6 operaciones (3 por llamar a la función en sí y 3 para multiplicar los valores).
Ahora les presento otra posible aplicación factorial:
factorial 1 c = c
factorial k c = factorial (k-1) (c*k)
Ésta es recursivo, también. Se llamará a sí mismo 3 veces. Pero no tiene el problema de tener que "volver" para calcular las multiplicaciones de todos los resultados, ya que ya estoy pasando el resultado como argumento de la función.
Esto es, por lo que he entendido, de lo que se trata Tail Recursion. Ahora, parece un poco mejor que el primero, pero igual puede tener desbordamientos de pila tan fácilmente. He oído que el compilador de Haskell convertirá las funciones recursivas de cola en bucles for the behind. Supongo que esa es la razón por la que vale la pena hacer las funciones recursivas de la cola.
Si ese es el motivo, entonces no hay necesidad de tratar de hacer las funciones recursivas si el compilador no va a hacer este truco inteligente, ¿estoy en lo cierto? Por ejemplo, aunque en teoría el compilador de C# podía detectar y convertir las funciones recursivas de la cola en bucles, sé (al menos es lo que he escuchado) que actualmente no lo hace. Por lo tanto, no tiene ningún sentido hoy en día hacer que las funciones sean recursivas. ¿Es asi?
Gracias!
simplemente señalando que la definición factorial "estándar" es 'factorial = 0 1' – irrelephant
Sí, thoug ht de eso, pero factorial 1 = 1 es más eficiente. –
Ya sabes, guardar un solo paso de iteración es probablemente la * última * cosa de la que preocuparse cuando se calculan los factoriales. ¡Además, si intentas calcular 99999999! Estoy bastante seguro de que los desbordamientos de pila serán el menor de tus problemas. –