Python中最大遞歸深度值的探討
Python對(duì)遞歸函數(shù)設(shè)置是有默認(rèn)值。 可以通過(guò)下面命令來(lái)查看設(shè)置的默認(rèn)值
>>> import sys >>> sys.getrecursionlimit() 3000
查看該函數(shù)的幫助文件就更清晰了:
>>> 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.
從上面的幫助信息可以看到,如果超過(guò)這個(gè)默認(rèn)的最大遞歸深度,就會(huì)導(dǎo)致不可預(yù)測(cè)的錯(cuò)誤,比如C棧溢出或其他錯(cuò)誤。 下面用斐波那契數(shù)列的遞歸函數(shù)來(lái)測(cè)試下該方法,來(lái)看真正可行的最大遞歸深度.
>>> def fib(n): ... if n == 1: ... return 1 ... else: ... return fib(n-1) + n >>> fib(2989) 4468555
當(dāng)執(zhí)行到默認(rèn)的3000附近,2989時(shí),上面是可以執(zhí)行到的。當(dāng)遞歸深度到2900時(shí)就報(bào)錯(cuò)了。
>>> 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
也就是最大的實(shí)際遞歸深度就是2989了,是否可以設(shè)置這個(gè)值大點(diǎn)呢? 可以通過(guò)這個(gè)方法來(lái)設(shè)置:
>>> import sys >>> sys.setrecursionlimit(10000) >>> sys.getrecursionlimit() 10000
通過(guò)setrecursionlimit(10000)后再查看就是10000。再來(lái)測(cè)試下實(shí)際上的遞歸深度可以到多少,看是否在2989上有所增加呢?
可以看到我們?cè)O(shè)置最大遞歸深度10000,實(shí)際執(zhí)行遞歸深度達(dá)到3400,不再報(bào)RecursionError錯(cuò)誤,但會(huì)報(bào)關(guān)閉程序的提示。通過(guò)一個(gè)個(gè)單獨(dú)調(diào)試,到3213還能顯示正常答案。到3214就又報(bào)上面的提示了。
>>> fib(3213) 5163291
上面的是Python3.6.5得出的實(shí)際最大遞歸數(shù)字:3213。
同樣一臺(tái)計(jì)算機(jī),用Python2.7.10,同樣設(shè)置成默認(rèn)最大遞歸深度10000,得出實(shí)際最大遞歸深度是4484
>>> fib(4484) 10055370
所以最終這個(gè)數(shù)字取決于計(jì)算機(jī)本身的計(jì)算能力和Python的版本,如果超過(guò)系統(tǒng)堆棧深度,Python無(wú)法支撐也就奔潰了。同樣的PC,Python的版本不同,這個(gè)值都有差異。有的時(shí)候差異還很大。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Python NumPy中diag函數(shù)的使用說(shuō)明
這篇文章主要介紹了Python NumPy中diag函數(shù)的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05python應(yīng)用程序在windows下不出現(xiàn)cmd窗口的辦法
這篇文章主要介紹了python應(yīng)用程序在windows下不出現(xiàn)cmd窗口的辦法,適用于python寫(xiě)的GTK程序并用py2exe編譯的情況下,需要的朋友可以參考下2014-05-05Python動(dòng)態(tài)語(yǔ)言與鴨子類型詳解
這篇文章主要介紹了Python動(dòng)態(tài)語(yǔ)言與鴨子類型詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python批量查詢關(guān)鍵詞微信指數(shù)實(shí)例方法
在本篇文章中小編給大家整理的是關(guān)于Python批量查詢關(guān)鍵詞微信指數(shù)實(shí)例方法以及相關(guān)代碼,需要的朋友們可以跟著學(xué)習(xí)下。2019-06-06python manage.py runserver流程解析
這篇文章主要介紹了python manage.py runserver流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11python 模擬網(wǎng)站登錄——滑塊驗(yàn)證碼的識(shí)別
這篇文章主要介紹了python 模擬網(wǎng)站登錄——滑塊驗(yàn)證碼的識(shí)別,幫助大家更好的理解和學(xué)習(xí)使用python的爬蟲(chóng)技術(shù),感興趣的朋友可以了解下2021-03-03Django中反向生成models.py的實(shí)例講解
今天小編就為大家分享一篇Django中反向生成models.py的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Flask-Docs自動(dòng)生成Api文檔安裝使用教程
這篇文章主要為大家介紹了Flask-Docs自動(dòng)生成Api文檔安裝使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10使用Python腳本來(lái)控制Windows Azure的簡(jiǎn)單教程
這篇文章主要介紹了使用Python腳本來(lái)控制Windows Azure的簡(jiǎn)單教程,由于微軟官方提供了Python SDK,使得用戶自己用Python控制Azure成為了可能,需要的朋友可以參考下2015-04-04