我正在用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)
答案 0 :(得分: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 ...
区块之前。
答案 1 :(得分:0)
我已将代码更改为这样:
def poruszanie(lista,pozycja,numCell,flagOfExecution):
flaga = 0
if flagOfExecution==0:
pozycjaTmp = pozycja
else:
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,1)
else:
if 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,1)
return pozycjaTmp
球停留在容器壁之间,但现在我有问题:
File "gaz.txt", line 130, in poruszanie
if pozycjaTmp==lista[i].pos:
RuntimeError:调用Python对象时超出了最大递归深度