Tengo una función recursiva (en C#) que necesito llamar unas 800 millones de veces; esto obviamente normalmente resultaría en un desbordamiento de la pila después de aproximadamente la llamada 900a. Lo eché a varios bucles, pero el patrón recursivo es mucho más fácil y más limpio de mantener.Funciones recursivas, desbordamientos de pila e Y-Combinators
Estoy tratando de implementar la función recursiva usando un combinador y, a partir de lo que estoy leyendo y viendo, que debería resolver el problema de desbordamiento de pila, y corregir los múltiples bucles anidados.
¿Alguien tiene experiencia con el y-combinator? ¿Todavía estaré atrapado en un desbordamiento de pila?
Tome el ejemplo simple de un factorial. Un factorial en la mayoría de los números más grandes que como 5,000 causará un desbordamiento de la pila. Si utilicé un combinador y correctamente en ese escenario, ¿solucionaría el desbordamiento de la pila?
No parece trivial de implementar, por lo que quiero confirmarlo antes de gastar el esfuerzo/recursos de desarrollo implementando y aprendiendo el y-combinator.
Lamentablemente, no, estoy usando C#, y recorriendo 3 colecciones separadas, que generan cada 2 o 3 colecciones internas, que necesitan llamar hasta 8 versiones diferentes de la misma función, con solo pequeñas cosas variando entre ellos. Me las arreglé para reescribirla como una función (todavía cerca de 120 líneas), que se llama de manera recursiva, pero no con recursividad de cola, de ahí que explota alrededor de la llamada 900a. –
Según tengo entendido, C# soporta la recursión de cola correcta desde .NET 4.0: [Mejoras de llamada de cola en .NET Framework 4] (http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail -call-improvements-in-net-framework-4.aspx) y [Recursividad de cola en C# y F #] (http://lookingsharp.wordpress.com/2010/03/08/tail-recursion-in-csharp-and -fsharp /). Ciertamente optimiza la recursividad de cola al compilar para Cualquier CPU y ejecutar el programa en una máquina de 64 bits, si eso es de alguna ayuda ... –
@SaschaHennig: Es bueno saberlo, gracias. –