2010-12-22 19 views
33

¿Existe algún control de cuánto puede llamar recursivamente algo?C# Profundidad de recursión: ¿a qué profundidad puede ir?

Desde un programa de prueba básica consigo un nivel de recursividad de poco más de 18k

que depende del tamaño de la pila ....

hay una manera de establecer un trozo de memoria (tal vez un hilo) con una pila masiva para aumentar la profundidad de recursión?

+0

posible duplicado de [Cómo se cambia el tamaño predeterminado de la pila para ejecutable administrado.net] (http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -executable-net) –

+1

infinitamente profundo. O al menos en idiomas que admiten llamadas de cola. – Juliet

+6

3 niveles de profundidad ...

Respuesta

40

He incrementado el tamaño de la pila durante el reconocimiento de algunos documentos. Fue realmente necesario.

lo que puede aumentar el tamaño de la pila para obtener hilo utilizando el código siguiente:

var stackSize = 10000000; 
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize); 

rosca (ThreadStart, Int32) - Inicializa una nueva instancia de la clase hilo, que especifica el tamaño máximo de pila para el hilo.

Source

Hope esto lo que necesita.

+9

Realmente dudo que esto es lo que alguien necesita. Simplemente no debería crear código como este, despediría a un programador que lo intentó. Cualquier algoritmo recursivo se puede implementar sin utilizar la recursión y, a veces, se puede implementar de forma que se reduzca el orden del problema en una magnitud. Esto es como un mecánico que usa un mazo para reparar un motor. – Mick

+0

@Mick, ¿y si el código que usa la recursión está fuera de su control? Por ejemplo, podría estar utilizando una biblioteca de terceros que usa recursividad. – Sam

+8

Encontraría una cuarta parte;) – Mick

5

El tamaño de pila predeterminado se almacena en el encabezado PE.

Si engendra usted mismo el hilo, Thread tiene un constructor que toma el tamaño de la pila como parámetro.

Sin embargo, el tamaño de pila .NET predeterminado de 1 MB debería ser suficiente para la mayoría de las tareas, por lo que antes de cambiarlo, al menos debería revisar la tarea.

16

Creo que está arriesgando problemas aquí. Es difícil determinar exactamente cuánta pila usará un algoritmo recursivo. Y, si estás al punto donde hay alguna pregunta sobre si habrá suficiente, buscaría otro enfoque.

La mayoría de los algoritmos recursivos podrían reescribirse para que no sean recursivos. A continuación, puede asignar tanta memoria como necesite e incluso recuperar con gracia si no es suficiente.

+16

+1 Cada algoritmo recursivo se puede escribir como no recursivo con un bucle y una estructura de datos de pila. –

+6

@Byron: Gracias por hacerme recordar mi clase de estructuras de datos en la universidad. Prof: "Escriba este programa tree-traversal en un formato no recursivo". Yo: "¿Por qué nos odias?" :) –

+4

Mi pregunta era cómo hacerlo, era más curioso que querer hacerlo realmente. Si bien este es un buen consejo, no responde a la pregunta planteada. –

2

Incluso si logra obtener mayores profundidades de recursión, simplemente por razones de rendimiento implementaría este algoritmo sin recurrencia. Las llamadas a métodos son mucho más caras que las iteraciones dentro de un ciclo while. Recomiendo encarecidamente que no se implemente nada que requiera manipular el tamaño predeterminado de la pila.

De vez en cuando uso la recursividad, pero solo cuando la profundidad de la llamada está definida y baja (como en menos de 100). Cuando se crea un software comercial, el uso de algoritmos recursivos que tienen un número indefinido de iteraciones es completamente poco profesional y es probable que le genere clientes muy enojados.

Cuestiones relacionadas