Last Updated on 2025年7月28日
概要
Pythonを使用していると、関数の呼び出し中に「RecursionError: maximum recursion depth exceeded」というエラーが発生することがあります。これは再帰的な処理を行っている際によく見られるエラーです。この記事では、このエラーの意味や発生原因、具体的な対処法について詳しく解説します。
目次
エラー内容
このエラーは、Pythonにおける再帰関数の呼び出し回数が上限を超えた場合に発生します。以下は実際に発生したエラーの例です。
|
1 2 3 |
RecursionError: maximum recursion depth exceeded while calling a Python object |
または以下のような表記も見られます。
|
1 2 3 |
RecursionError: maximum recursion depth exceeded in comparison |
いずれも、「ある関数が自分自身を何度も呼び出した結果、Pythonが設定している最大再帰深度(デフォルトで1000)を超えた」ことを意味します。
原因
このエラーの主な原因は、以下のような無限または過剰な再帰呼び出しにあります。
- 停止条件がない再帰関数:終了条件が正しく設定されていない
- 引数が変化しない再帰:毎回同じ値で呼び出されている
- 意図しない無限ループ:設計ミスで終了しない構造になっている
以下は典型的な誤った再帰関数の例です。
|
1 2 3 4 5 6 |
def infinite_recursion(): return infinite_recursion() infinite_recursion() |
上記のコードは終了条件がないため、再帰が永久に続き、最終的に再帰深度の上限を超えてエラーになります。
対処法
このエラーに対処する方法は主に以下の3つに分けられます。
1. 再帰の停止条件を明確に設定する
再帰関数には必ず終了条件(ベースケース)を設定しましょう。以下はフィボナッチ数列を正しく求める例です。
|
1 2 3 4 5 6 7 8 |
def fibonacci(n): if n <= 1: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(10)) # 出力: 55 |
2. 最大再帰深度の変更
一時的な対策として、Pythonの再帰上限を変更することも可能です。sysモジュールを使います。
|
1 2 3 4 |
import sys sys.setrecursionlimit(2000) |
ただし、これはあくまで一時的な処置であり、根本的な解決にはなりません。再帰が多すぎる設計自体を見直すべきです。
3. 再帰の代わりにループを使用する
多くの場合、再帰はループで書き換えることができます。以下は階乗の計算をループで行う例です。
|
1 2 3 4 5 6 7 |
def factorial(n): result = 1 for i in range(2, n+1): result *= i return result |
4. タイプミスや意図しない自己呼び出しをチェックする
以下のように、関数名の間違いや引数の扱いで再帰が止まらないことがあります。
|
1 2 3 4 5 |
def process(data): # 本来は別の関数を呼び出すべきだったのに、自分を呼んでいる return process(data) |
補足
再帰は非常に強力な手法ですが、使用には注意が必要です。特にPythonはC言語などとは異なり、再帰のパフォーマンスや最適化に制限があります。
最大再帰数の確認方法
|
1 2 3 4 |
import sys print(sys.getrecursionlimit()) # 通常は1000と表示されます |
安全に再帰を扱う方法
- ベースケースを明示する
- 引数の変化を確認する
- テストデータで何度呼び出されるか確認する
再帰の使用が適しているケース
- 木構造(ツリー構造)の探索
- バックトラックを使う問題
- 深さ優先探索(DFS)などのアルゴリズム
まとめ
RecursionError: maximum recursion depth exceededは、Pythonで再帰処理を行う際によく起こるエラーの一つです。エラーが出た場合は、以下の点をチェックしましょう。
- 終了条件(ベースケース)が設定されているか
- 再帰の引数が正しく変化しているか
- 無限再帰になっていないか
- 本当に再帰で書く必要があるか
根本的には「設計の見直し」が最も効果的な対策です。再帰にこだわらず、ループやスタック構造など他の手法への置き換えも検討しましょう。


