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 fibRecursionError: maximum recursion depth exceeded in comparisonmaximum 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的版本不同,這個值都有差異。有的時候差異還很大。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答