1. ホーム
  2. python

[解決済み] Pythonの最大再帰深度とその増やし方とは?

2022-03-17 07:49:34

質問

このような末尾再帰関数があります。

def recursive_function(n, sum):
    if n < 1:
        return sum
    else:
        return recursive_function(n-1, sum+n)

c = 998
print(recursive_function(c, 0))

まで動作します。 n=997 を出力します。 RecursionError: maximum recursion depth exceeded in comparison . これは単なるスタックオーバーフローなのでしょうか?これを回避する方法はあるのでしょうか?

解決方法は?

スタックオーバーフローに対するガードですね。Python(というかCPythonの実装)は末尾再帰を最適化しないので、奔放な再帰はスタックオーバーフローを引き起こします。再帰の上限を確認するには sys.getrecursionlimit :

import sys
print(sys.getrecursionlimit())

で再帰の上限を変更します。 sys.setrecursionlimit :

sys.setrecursionlimit(1500)

標準の制限は少し控えめですが、Pythonのスタックフレームはかなり大きくなる可能性があります。

Pythonは関数型言語ではないので、末尾再帰は特に効率的な手法ではありません。可能であれば、アルゴリズムを繰り返し書き直す方が一般的には良い考えです。