python不能無(wú)限的遞歸調(diào)用下去。并且當(dāng)輸入的值太大,遞歸次數(shù)太多時(shí),python 都會(huì)報(bào)錯(cuò)
成都創(chuàng)新互聯(lián)公司主營(yíng)嵊州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件定制開(kāi)發(fā),嵊州h5微信小程序開(kāi)發(fā)搭建,嵊州網(wǎng)站營(yíng)銷推廣歡迎嵊州等地區(qū)企業(yè)咨詢
首先說(shuō)結(jié)論,python解釋器這么會(huì)限制遞歸次數(shù),這么做為了避免"無(wú)限"調(diào)用導(dǎo)致的堆棧溢出。
tail recursion 就是指在程序最后一步執(zhí)行遞歸。這種函數(shù)稱為 tail recursion function。舉個(gè)例子:
這個(gè)函數(shù)就是普通的遞歸函數(shù),它在遞歸之后又進(jìn)行了 乘 的操作。 這種普通遞歸,每一次遞歸調(diào)用都會(huì)重新推入一個(gè)調(diào)用堆棧。
把上述調(diào)用改成 tail recursion function
tail recursion 的好處是每一次都計(jì)算完,將結(jié)果傳遞給下一次調(diào)用,然后本次調(diào)用任務(wù)就結(jié)束了,不會(huì)參與到下一次的遞歸調(diào)用。這種情況下,只重復(fù)用到了一個(gè)堆棧。因此可以優(yōu)化結(jié)構(gòu)。就算是多次循環(huán),也不會(huì)出現(xiàn)棧溢出的情況。這就是 tail recursion optimization 。
c和c++都有這種優(yōu)化, python沒(méi)有,所以限制了調(diào)用次數(shù),就是為了防止無(wú)限遞歸造成的棧溢出。
如果遞歸次數(shù)過(guò)多,導(dǎo)致了開(kāi)頭的報(bào)錯(cuò),可以使用 sys 包手動(dòng)設(shè)置recursion的limit
手動(dòng)放大 recursionlimit 限制:
首先python是支持遞歸的(但是對(duì)遞歸層數(shù)有限制,如果超過(guò)了限制會(huì)報(bào)錯(cuò)),所以出錯(cuò)有可能是你程序的問(wèn)題,最好貼出你的程序和錯(cuò)誤信息。
如果解決了您的問(wèn)題請(qǐng)采納!
如果未解決請(qǐng)繼續(xù)追問(wèn)
函數(shù)add_沒(méi)有返回任何東西,或者說(shuō)返回值是None
因此n+add_(n-1)是int型與None相加,這在Python中是非法的
于是TypeError發(fā)生。
使用遞歸一定要有退出遞歸的條件,在你的函數(shù)里:if l[mid] == aim:應(yīng)該是退出的條件,但是你的例子卻無(wú)法滿足這個(gè)條件,所以就超過(guò)深度報(bào)錯(cuò)了。
本文標(biāo)題:python函數(shù)遞歸報(bào)錯(cuò) python跳出遞歸
標(biāo)題來(lái)源:http://jinyejixie.com/article26/dosdcjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、標(biāo)簽優(yōu)化、、品牌網(wǎng)站制作、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)