ここに末尾再帰関数があります:
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
。これは単なるスタック オーバーフローでしょうか? 回避する方法はありますか?
ベストアンサー1
これはスタックオーバーフローを防ぐためのものです。Python(というかCPythonの実装)は末尾再帰を最適化しておらず、無制限の再帰はスタックオーバーフローを引き起こします。再帰制限は次のように確認できます。sys.getrecursionlimit
:
import sys
print(sys.getrecursionlimit())
再帰制限を変更するにはsys.setrecursionlimit
:
sys.setrecursionlimit(1500)
しかし、そうすることは危険です。標準の制限は少し控えめですが、Python のスタックフレームはかなり大きくなる可能性があります。
Python は関数型言語ではなく、末尾再帰は特に効率的な手法ではありません。可能であれば、アルゴリズムを反復的に書き直す方が一般的には良いアイデアです。