ホーム › エラー解決 › Python › RecursionError
PYTHON ERROR

Python RecursionError: maximum recursion depth exceeded の原因と直し方

「RecursionError: maximum recursion depth exceeded」は、関数が自分自身を呼び続け、Pythonの再帰の深さ上限(デフォルト1000)を超えたときのエラーです。

このエラーメッセージ

RecursionError: maximum recursion depth exceeded in comparison

原因

❌ エラーになるコード

NG
def fact(n):
    return n * fact(n - 1)

print(fact(5))

✅ 修正したコード

OK
def fact(n):
    if n <= 1:      # 終了条件
        return 1
    return n * fact(n - 1)

print(fact(5))

# 深い処理はループに書き換える
def fact_loop(n):
    r = 1
    for i in range(2, n + 1):
        r *= i
    return r

print(fact_loop(5))
▶ 修正済みコードを実行エディタで開く
progoのPython実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

まずif n <= 1: return 1のような終了条件があるか、呼ぶたびに引数が終了条件へ近づいているかを確認します。正しい再帰でも深くなる場合はループへの書き換えが確実で、どうしても再帰が必要なときだけsys.setrecursionlimit(5000)で上限を上げます(上げすぎるとクラッシュします)。

よくある質問

sys.setrecursionlimitで上限を上げてよい?
小さな範囲なら有効ですが、上げすぎるとスタックオーバーフローでプロセスが落ちます。まず終了条件とループ化を検討してください。
Pythonの再帰上限はいくつ?
デフォルトは1000です。sys.getrecursionlimit()で確認できます。
再帰とループはどちらがよい?
Pythonは末尾再帰最適化がないため、深くなる処理はループの方が安全で高速です。