4 回答

TA貢獻(xiàn)165條經(jīng)驗 獲得超90個贊
首先貼出報錯信息:
RecursionError: maximum recursion depth exceeded
遞歸錯誤:超出最大遞歸深度
好,這說明兩個問題,其一 Python 對遞歸的深度有限制, 其二 這個函數(shù)超出了這個限度。
先說下后者吧,為什么去掉 return ?之后會 使這個函數(shù)超出了 Python 的最大遞歸深度呢, 這是因為 return 有兩個屬性:
1 返回值,2 結(jié)束函數(shù)執(zhí)行。 如果去掉了 return 這個遞歸函數(shù)就會無限遞歸下去,大致執(zhí)行效果如下:
fact(5) ##?沒有去掉?return?時: fact(5)?=?5?*?fact(4) fact(5)?=?5?*?4?*?fact(3) fact(5)?=?5?*?4?*?3?*?fact(2) fact(5)?=?5?*?4?*?3?*?2?*?fact(1) fact(5)?=?5?*?4?*?3?*?2?*?1?##?此時fact函數(shù)判斷出參數(shù)為1?直接return?1?并且退出了函數(shù),也就是打斷了遞歸。 ##?去掉?return?時: fact(5)?=?5?*?fact(4) fact(5)?=?5?*?4?*?fact(3) fact(5)?=?5?*?4?*?3?*?fact(2) fact(5)?=?5?*?4?*?3?*?2?*?fact(1) fact(5)?=?5?*?4?*?3?*?2?*?1?*?fact(-1)?#這里是關(guān)鍵,去掉了return,致使參數(shù)無限的遞減下去而不終結(jié) fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?fact(-2) . . . fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?...?*?-n?*?fact(-n-1) . . . ##?所以最終就突破了?最大遞歸深度。
現(xiàn)在我們說下, Python 對遞歸深度的限制, 一般來說是 1000, 好像也有人說 是 997 什么的,大概就在這個范圍。
那么為什么Python 會對遞歸 這個 看起來特別強(qiáng)大的 解決問題的思想加以限制呢?
這就要說到, Python 中遞歸的原理了,簡單來說就是每一次遞歸都建立一個函數(shù),也就是說在內(nèi)存中 占用一塊地址,如果不加以限制的話, 就會導(dǎo)致 內(nèi)存溢出,這時候程序 就會報錯了, 所以Python 對遞歸的深度加以限制。
Python 也給出了 改變這個限制的方法:
import?sys sys.setrecursionlimit(depth)?##?depth?為int?類型,?傳進(jìn)去就可以改變遞歸的最大深度了。
不建議這么做,如果一個問題需要突破遞歸深度才能解決,那么遞歸也許就不是這個問題的最優(yōu)解了, 建議用其他方式解決問題,而不是輕易改變遞歸深度。

TA貢獻(xiàn)2條經(jīng)驗 獲得超0個贊
這個函數(shù)為什么不會無限遞歸下去?
def move(n, a, b, c):
? ? if n==1:
? ? ? ? print a,'-->',c
? ? ? ? return?
? ? move(n-1,a,c,b)

TA貢獻(xiàn)3條經(jīng)驗 獲得超1個贊
也不一定會報錯,我調(diào)試了,如果沒有return,就沒有返回值,函數(shù)運(yùn)行的結(jié)果就是空值。
添加回答
舉報