1. ホーム
  2. python

[解決済み] Pythonで再帰?RuntimeError: Pythonオブジェクトの呼び出し中に最大再帰深度を超えました [重複] RuntimeError: Pythonオブジェクトの呼び出し中に最大再帰深度を超えました。

2022-03-15 19:10:49

質問

<ブロッククオート

重複の可能性があります。
最大再帰深度?

私のコードにはもう一つ問題があります。 私はVpythonで最初のプログラムを書いていて、2つの気体を混ぜ合わせるシミュレーションをしなければなりません。最初は境界線に問題があったのですが、今はボール(ガス粒子を表す)が境界線にとどまると、何か違うことが起こります。数秒後、エラーが発生しました。以下に私の関数のソースコードを示します。

コード

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 or positionTmp[1]<=-numCell:
            return MovingTheBall(lista,(position[0]+choice([-1,0,1]),position[1]+choice([-1,0,1]),0),numCell,1)

        return positionTmp

というエラーが発生します。

    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

どなたか、この機能を簡略化する方法を考えていただけませんか?

whileループで関数を実行しています。

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には、lispのような関数型言語で一般的な末尾再帰の最適化が欠けています。Pythonでは、再帰は999回の呼び出しに制限されています( sys.getrecursionlimit ).

999の深さが想定以上だった場合、再帰を停止する条件が実装に欠けていないか、あるいはこのテストが間違っている場合があることを確認してください。

あえて言えば、Pythonでは、純粋な再帰的アルゴリズムの実装は正しくない/安全ではない、ということです。999に限定したfib()の実装は、本当に正しくないのです。再帰的なものを反復的なものに変換することは常に可能であり、そうすることは些細なことです。

多くの再帰的アルゴリズムでは深さが対数になる傾向があるため、あまり到達しないのです。もしあなたのアルゴリズムがそうでなく、999コールより深い再帰を期待するのであれば、2つのオプションがあります。

1) 再帰回数制限を変更するには sys.setrecursionlimit(n) を、お使いのプラットフォームで許容される最大値まで設定します。

<ブロッククオート

sys.setrecursionlimit(limit) :

Pythonインタプリタスタックの最大深度をlimitに設定します。この制限は、無限再帰が C スタックのオーバーフローを引き起こし、Python をクラッシュさせることを防ぎます。

可能な最高限度額はプラットフォーム依存です。深い再帰を必要とするプログラムがあり、高い制限値をサポートするプラットフォームがある場合、ユーザは制限値を高く設定する必要があるかもしれません。高すぎる制限はクラッシュを引き起こす可能性があるため、これは慎重に行う必要があります。

2) アルゴリズムを再帰的なものから反復的なものに変換してみることができます。もし再帰的深度がプラットフォームで許容されるより大きい場合、問題を解決する唯一の方法です。以下のようなものがあります。 インターネット上のステップバイステップの説明 で、CSをある程度学んだ人であれば、簡単な操作でできるはずです。もし、お困りのようでしたら、新たに質問を投稿していただければ、お手伝いします。