[解決済み] Pythonで再帰?RuntimeError: Pythonオブジェクトの呼び出し中に最大再帰深度を超えました [重複] RuntimeError: Pythonオブジェクトの呼び出し中に最大再帰深度を超えました。
質問
重複の可能性があります。
最大再帰深度?
私のコードにはもう一つ問題があります。 私は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をある程度学んだ人であれば、簡単な操作でできるはずです。もし、お困りのようでしたら、新たに質問を投稿していただければ、お手伝いします。
関連
-
Python jiabaライブラリの使用方法について説明
-
任意波形を生成してtxtで保存するためのPython実装
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] Pythonで、あるオブジェクトが反復可能かどうかを判断するにはどうしたらいいですか?
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] Pythonでnullオブジェクトを参照する
-
[解決済み] Pythonの最大再帰深度とその増やし方とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonを使ったオフィス自動化コード例
-
python string splicing.join()とsplitting.split()の説明
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] Pythonの最大再帰深度とその増やし方とは?