Python中的递归:我做错了什么?

Python中的递归:我做错了什么?,python,recursion,simulation,vpython,Python,Recursion,Simulation,Vpython,我正在用python编写我的第一个程序,它必须模拟粒子(两种气体)的混合。我不知道这个函数有什么问题。 我不希望粒子离开特定区域,即容器的壁。 我用VPython def poruszanie(lista,pozycja,numCell): flaga = 0 pozycjaTmp = (pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0) for i in range( 0, len(lista) ):

我正在用python编写我的第一个程序,它必须模拟粒子(两种气体)的混合。我不知道这个函数有什么问题。 我不希望粒子离开特定区域,即容器的壁。 我用VPython

def poruszanie(lista,pozycja,numCell):
    flaga = 0
    pozycjaTmp = (pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0)
    for i in range( 0, len(lista) ):
        if pozycjaTmp==lista[i].pos:
            flaga=1

    if flaga==1:
        return poruszanie(lista,(pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0),numCell)
    elif pozycjaTmp[0]==0 or pozycjaTmp[0]==numCell or pozycjaTmp[0]==-numCell or pozycjaTmp[1]==numCell or pozycjaTmp[1]==-numCell:
        return poruszanie(lista,(pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0),numCell)

    return pozycjaTmp
poruszanie-函数的名称

pozycja-球体的位置

<P>0,NUMCELL,-NUMCEL -容器的边界(0是中间的墙,分隔在下注中的气体)

所有这些都在x,y平面上,z始终为0 这就是我开始使用这个函数的地方:

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

我认为你每次都是一模一样,没有正确地返回:

if flaga==1:
    return poruszanie(lista,(pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0),numCell)
else:
    if pozycjaTmp[0]==0 or pozycjaTmp[0]==numCell or pozycjaTmp[0]==-numCell:
        poruszanie(lista,(pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0),numCell)
    elif pozycjaTmp[1]==numCell or pozycjaTmp[1]==-numCell:
        poruszanie(lista,(pozycja[0]+choice([-1,0,1]),pozycja[1]+choice([-1,0,1]),0),numCell)
第一次打电话你就回来了,但下两次打电话你就不回来了。而且,您传递的参数看起来完全相同

编辑

考虑到编辑和新错误(达到最大深度)

该错误意味着您的函数递归的距离超出了python允许的范围


我仍然不确定你在做什么,但是你需要一个基本条件,无论递归在什么时候停止。如果您满足
的任一分支,如果。。。elif…
语句每次调用函数时,递归将永远不会停止。你需要的东西总是会坏的,最好把它放在
if。。elif…
block.

我编辑了您的问题,希望能解决缩进错误。如果您可以说明运行此操作(如果它引发异常,在整个回溯后)时会出现什么错误,以及样本输入和预期输出(如果可能),这将非常有用。假设粒子的位置发生了变化,并且确实发生了变化。但是它离开了容器的边界,而1:rate(20)为范围内的i(0,len(self.listball)):self.listball[i].pos=poruszanie(self.listball,self.listball[i].pos,self.numCell)我已经更改了帖子,以便您可以看到它现在的样子。仍然存在一个问题粒子看起来像是停留在容器内,但过了一会儿,它们一个接一个地离开了边界