recursive python3 loop how create python recursion

python3 - recursive loop python



Recursión máxima de Python, pregunta sobre sys.setrecursionlimit() (3)

Se basa en la profundidad TOTAL de la pila y no en la profundidad de ninguna función en particular. Probablemente ya estés en una pila de 5 cuando haces la primera llamada a rec ().

Tome por ejemplo 5 funciones recursivas. Cada uno hace 98 llamadas recursivas y la última es para la siguiente función recursiva. Con un límite de recursión de 100, ¿realmente desea permitir que cada función recursiva realice 99 llamadas con una profundidad total de ~ 500 llamadas? No, eso podría colgar al intérprete a esas profundidades.

Por lo tanto, el límite de recursión es la profundidad máxima de todas las funciones a nivel mundial, no una sola función nombrada.

Tengo una pregunta sobre sys.setrecursionlimit ()

desde el python doc esta función:

Establezca la profundidad máxima de la pila de intérpretes de Python en el límite. Este límite evita que la recursión infinita cause un desbordamiento de la pila C y bloquee Python. El límite más alto posible depende de la plataforma. Un usuario puede necesitar establecer el límite más alto cuando tiene un programa que requiere recursión profunda y una plataforma que admite un límite superior. Esto debe hacerse con cuidado, porque un límite demasiado alto puede provocar un bloqueo.

Aquí está mi pregunta:

tomemos esta función recursiva inútil:

def rec(N): if N==0: return 1 else: return rec(N-1);

ahora establezcamos la recursividad máxima en 100:

sys.setrecursionlimit(100)

Si intento rec(99) (100 llamadas recursivas), obtengo:

RuntimeError: maximum recursion depth exceeded

Para calcular rec (99) necesito establecer el límite de recursión en 105

Por qué esto es tan ?


Todavía hay llamadas de funciones que el tiempo de ejecución de Python necesita realizar para acceder a su función.


Está mal llamado. Debería decir Profundidad de pila, no profundidad de recursión. La recursividad implica que es el mismo hilo una y otra vez que es limitante. En realidad, podría tener un código real que solo tiene llamadas de 100 de profundidad. No lo recomendaría, pero podrías. Pueden salirse con la suya porque en el mundo práctico, las únicas veces que te encuentras con este escenario es con recursividad. Cuando se cuelga debido a esto, al ver la palabra "Recursion" le da una pista inmediata de qué buscar en lugar de "Stack".

(Stack debería darle la misma pista a cualquier programador decente, pero seamos honestos, tu código se bloqueó y quieres un mensaje de error relevante, ¿no? 99.99999% de las veces esto te dice exactamente lo que cometiste (te perdiste tu caso base por recursividad.))