1

Python で最初のプログラムを作成していますが、粒子 (2 つのガス) の混合をシミュレートする必要があります。この関数で何が間違っているのかわかりません。パーティクルが特定の領域、つまりコンテナの壁を離れないようにします。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)

最初の呼び出しからは戻りますが、次の 2 回からは戻りません。また、渡すパラメーターはまったく同じように見えます。

編集

編集と新しいエラーを考慮してください(最大深度に達しました)。

このエラーは、関数が python で許可されている範囲を超えて再帰していることを意味します。

何をしているのかはまだわかりませんが、再帰が何を停止するかに関係なく、その時点で基本条件が必要です。if ... elif ...関数を呼び出すたびにステートメントのいずれかの分岐を満たす場合、再帰は決して停止しません。常に壊れるものが必要であり、できればif .. elif ...ブロックの前に配置する必要があります。

于 2013-01-08T18:35:25.407 に答える