RecursionError: maximum recursion depth exceeded の原因と直し方
再帰関数に終了条件(ベースケース)が無い、または正しく機能していないときに発生します。再帰は必ずどこかで止まる条件が必要です。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
4- 行番号 — 実際にクラッシュした行
countdown- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
RecursionError- 例外クラス — 何が起きたか。ここを検索するのが最短です
maximum recursion depth exceeded- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 def countdown(n): 2 ^ 3 print(n) 4 return countdown(n - 1) 5 6 countdown(5)
Traceback (most recent call last):
File "main.py", line 6, in <module>
countdown(5)
File "main.py", line 4, in countdown
return countdown(n - 1)
^^^^^^^^^^^^^^^^
...(同じ行が何度も繰り返される)...
RecursionError: maximum recursion depth exceeded
終了条件(ベースケース)が無いと、再帰は自分自身を呼び続けます。Pythonは既定の再帰深度を超えると例外で止めます。
直し方: (空) を if n < 0: return にします。
広告
広告スロット(未設定)
パターン2
1 def factorial(n): 2 ^ 3 return n * factorial(n - 1) 4 5 print(factorial(5))
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(factorial(5))
^^^^^^^^^^^^
File "main.py", line 3, in factorial
return n * factorial(n - 1)
^^^^^^^^^^^^^^^^
...(同じ行が何度も繰り返される)...
RecursionError: maximum recursion depth exceeded
階乗の計算は定番の再帰例ですが、n<=1で止める条件を書き忘れると永遠に自分自身を呼び続けます。
直し方: (空) を if n <= 1: return 1 にします。
パターン3
1 def sum_up_to(n): 2 ^ 3 return n + sum_up_to(n - 1) 4 5 print(sum_up_to(5))
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(sum_up_to(5))
^^^^^^^^^^^^^
File "main.py", line 3, in sum_up_to
return n + sum_up_to(n - 1)
^^^^^^^^^^^^^^^^
...(同じ行が何度も繰り返される)...
RecursionError: maximum recursion depth exceeded
1からnまでの合計を再帰で求める場合も同様です。0以下になったら足すのをやめる条件が必要です。
直し方: (空) を if n <= 0: return 0 にします。
よくある誤解
無限ループと違い、再帰の暴走はスタックが尽きるまで気づかれないことがあります。Pythonは既定で再帰の深さに上限を設けており、超えると例外で止めてくれます。
まとめ
RecursionError: maximum recursion depth exceededは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。