¿Recursión en Python? RuntimeError: se excedió la profundidad máxima de recursión al llamar a un objeto de Python

Posible duplicado:
Máxima profundidad de recursión?

Tengo otro problema con mi código. Estoy escribiendo mi primer progtwig en Vpython y tengo que hacer una simulación de mezclar dos gases. Primero tuve un problema con las fronteras, pero ahora cuando las bolas (que representan las partículas de gas) permanecen dentro de las fronteras, hay algo diferente. Después de unos segundos recibo un error, que se muestra debajo del código fuente de mi función. Código:

def MovingTheBall(listOfBalls,position,numCell,flagOfExecution): flag = 0 if flagOfExecution==0: positionTmp = position else: positionTmp = (position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0) for i in range( 0, len(listOfBalls) ): if positionTmp==listOfBalls[i].pos: flag=1 if flag==1: return MovingTheBall(lista,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) else: if positionTmp[0]==0 or positionTmp[0]>=numCell or positionTmp[0]=numCell or positionTmp[1]<=-numCell: return MovingTheBall(lista,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) return positionTmp 

el error es:

  return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 138, in MovingTheBall return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 138, in MovingTheBall return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 138, in MovingTheBall return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 138, in MovingTheBall return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 138, in MovingTheBall return MovingTheBall(listOfBalls,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1) File "gaz.txt", line 130, in MovingTheBall if positionTmp==listOfBalls[i].pos: RuntimeError: maximum recursion depth exceeded while calling a Python object 

¿Alguien puede pensar en una manera de simplificar mi función?

Ejecuto la función it while loop:

     while 1: rate(20) for i in range(0,len(self.listOfBalls)): self.listOfBalls[i].pos=poruszanie(self.listOfBalls,self.listOfBalls[i].pos,self.numCell,0) 

    Python carece de las optimizaciones de recursión de cola comunes en lenguajes funcionales como lisp. En Python, la recursión se limita a 999 llamadas (consulte sys.getrecursionlimit ).

    Si 999 de profundidad es más de lo que esperaba, verifique si la implementación carece de una condición que detenga la recursión o si esta prueba puede ser incorrecta en algunos casos.

    Me atrevo a decir que en Python, las implementaciones de algoritmos recursivos puros no son correctas / seguras. Una implementación de fib () limitada a 999 no es realmente correcta. Siempre es posible convertir recursivo en iterativo, y hacerlo es trivial.

    No se alcanza a menudo porque en muchos algoritmos recursivos la profundidad tiende a ser logarítmica. Si no es así, es probable que su algoritmo reciba llamadas recursivas con más de 999 de profundidad, tiene dos opciones:

    1) Puede cambiar el límite de recursión con sys.setrecursionlimit(n) hasta el máximo permitido para su plataforma:

    sys.setrecursionlimit(limit) :

    Establezca la profundidad máxima de la stack de intérpretes de Python en límite. Este límite evita que la recursión infinita provoque un desbordamiento de la stack C y que Python se bloquee.

    El límite más alto posible depende de la plataforma. Es posible que un usuario deba establecer un límite más alto cuando tenga un progtwig que requiera una recursión profunda y una plataforma que admita un límite más alto. Esto debe hacerse con cuidado, ya que un límite demasiado alto puede provocar una caída.

    2) Puedes convertir para convertir el algoritmo de recursivo a iterativo. Si la profundidad de la recursión es mayor que la permitida por su plataforma, es la única forma de solucionar el problema. Si tiene problemas con eso, publique una nueva pregunta para que podamos ayudarlo.

    He cambiado la recursividad a iteración.

     def MovingTheBall(listOfBalls,position,numCell): while 1: stop=1 positionTmp = (position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0) for i in range(0,len(listOfBalls)): if positionTmp==listOfBalls[i].pos: stop=0 if stop==1: if (positionTmp[0]==0 or positionTmp[0]>=numCell or positionTmp[0]<=-numCell or positionTmp[1]>=numCell or positionTmp[1]<=-numCell): stop=0 else: return positionTmp 

    Funciona bien: d

    El error es un desbordamiento de stack. Eso debería sonar en este sitio, ¿verdad? Ocurre porque una llamada a poruszanie da poruszanie resultado otra llamada a poruszanie , lo que incrementa la profundidad de recursión en 1. La segunda llamada da como resultado otra llamada a la misma función. Eso sucede una y otra vez, incrementando cada vez la profundidad de la recursión.

    Ahora, los recursos utilizables de un progtwig son limitados. Cada llamada de función ocupa una cierta cantidad de espacio encima de lo que se llama la stack. Si se alcanza la altura máxima de stack, se obtiene un error de desbordamiento de stack.

    Ese es el error que se produce cuando una función realiza demasiadas llamadas recursivas a sí misma. Podría estar haciendo esto porque el caso base nunca se cumple (y, por lo tanto, se atasca en un bucle infinito) o simplemente haciendo un gran número de llamadas a sí mismo. Podrías reemplazar las llamadas recursivas con while loops.