1

我正在用 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 - 球体的位置

0,numCell,-numCell - 容器的边界(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)
4

1 回答 1

2

我认为您每次都将其称为完全相同并且没有正确返回:

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允许的递归更远。

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

于 2013-01-08T18:35:25.407 回答