1. 程式人生 > >Python中最大遞迴深度值探討

Python中最大遞迴深度值探討

Python對遞迴函式設定是有預設值。 可以通過下面命令來檢視設定的預設值

>>> import sys
>>> sys.getrecursionlimit()
3000

檢視該函式的幫助檔案就更清晰了:

>>> help(sys.getrecursionlimit)
Help on built-in function getrecursionlimit in module sys:

getrecursionlimit(...)
    getrecursionlimit()

    Return the current value of the recursion limit, the maximum depth
    of the Python interpreter stack.  This limit prevents infinite
    recursion from causing an overflow of the C stack and crashing Python.

從上面的幫助資訊可以看到,如果超過這個預設的最大遞迴深度,就會導致不可預測的錯誤,比如C棧溢位或其他錯誤。 下面用斐波那契數列的遞迴函式來測試下該方法,來看真正可行的最大遞迴深度.

>>> def fib(n):
...     if n == 1:
...         return 1
...     else:
...         return fib(n-1) + n
>>> fib(2989)
4468555

當執行到預設的3000附近,2989時,上面是可以執行到的。當遞迴深度到2900時就報錯了。


>>> fib(2990)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in fib
  File "<stdin>", line 5, in fib
  File "<stdin>", line 5, in fib
  [Previous line repeated 2985 more times]
  File "<stdin>", line 2, in fib
RecursionError: maximum recursion depth exceeded in comparison

maximum recursion depth exceeded in comparison

也就是最大的實際遞迴深度就是2989了,是否可以設定這個值大點呢? 可以通過這個方法來設定:

>>> import sys
>>> sys.setrecursionlimit(10000)
>>> sys.getrecursionlimit()
10000

通過setrecursionlimit(10000)後再檢視就是10000。再來測試下實際上的遞迴深度可以到多少,看是否在2989上有所增加呢?

可以看到我們設定最大遞迴深度10000,實際執行遞迴深度達到3400,不再報RecursionError錯誤,但會報關閉程式的提示。通過一個個單獨除錯,到3213還能顯示正常答案。到3214就又報上面的提示了。

>>> fib(3213)
5163291

上面的是Python3.6.5得出的實際最大遞迴數字:3213。

同樣一臺計算機,用Python2.7.10,同樣設定成預設最大遞迴深度10000,得出實際最大遞迴深度是4484

>>> fib(4484)
10055370

所以最終這個數字取決於計算機本身的計算能力和Python的版本,如果超過系統堆疊深度,Python無法支撐也就奔潰了。同樣的PC,Python的版本不同,這個值都有差異。有的時候差異還很大。