遞歸函數及遞歸次數受到限制
求和:sum=n+n(n-1)+…+1
求階乘:n!=1x2x3…xn
解決問題的辦法是修改可遞歸的次數
如何控制遞歸的次數
第一種
第二種
第三種
遞歸函數及遞歸次數受到限制一個函數在內部調用自己,那麼這個函數是遞歸函數。遞歸會反復使用本身,每遞歸一次,越接近最終的值。當一個問題可以由許多相似的小問題解決, 可以考慮使用遞歸函數。隨著遞歸的深入,問題規模相比上次都應所減小。return函數本身的方法保證了遞歸的持續進行,但是如果沒有明確的結束條件,遞歸會無限進行下去。所以當已經到了問題解決的程度, 應該告訴函數結束遞歸,這就需要明確的結束條件。
常見的兩個遞歸例子:求和、求階乘n!
求和:sum=n+n(n-1)+…+1def sum(n): if n > 0: return n+sum(n-1) else: return 0 new_sum = sum(10)print(new_sum)#output55
求階乘:n!=1x2x3…xndef factorial(n): if n == 1: return 1 else: return n*factorial(n-1)new_sum = factorial(5)print(new_sum)#output120
使用遞歸函數需要注意遞歸次數默認限制為1000,如果遞歸次數較多會導致棧溢出的問題
比如
def sum(n): if n > 0: return 1+sum(n-1) else: return 0new_sum = sum(1000)print(new_sum)
會報RecursionError: maximum recursion depth exceeded in comparison的錯誤
解決問題的辦法是修改可遞歸的次數import syssys.setrecursionlimit(1500)#可遞歸次數修改為1500def sum(n): if n > 0: return 1+sum(n-1) else: return 0new_sum = sum(1000)print(new_sum)#output1000
修改遞歸次數時需要注意,修改可遞歸次數為1500,遞歸深度到不了1500,在1400左右。默認可遞歸次數為1000,遞歸深度也到不了1000,到992左右
如何控制遞歸的次數經常會用到遞歸,雖然能解決很多問題,但其缺點很明顯,有可能無法跳出造成死循環,能控制遞歸次數就可以避免這種情況。
用lua嘗試了幾種方法,
第一種在方法內定義一個變量計數:
function recursionTest() local times = 0 if times < 10 then times = times + 1 recursionTest() end if times == 0 then print("outer round") endend
執行下來,是無法限制的,因為局部變量每次都會重置為0。
第二種local recurTimes = 0function recursionTest2() if recurTimes < 10 then recurTimes = recurTimes + 1 recursionTest2() endend
這種方法可以控制次數,但是變量需要定義在方法體外,執行函數前都需要先把這個變量設為0,需要在遞歸方法外包一層,比較繁瑣。
第三種function recursion(str, t) str = str or "first time " t = t or 0 t = t + 1 print(str, t) if t < 10 then recursion("times:", t) end if t == 1 then print("outer round") endend
在遞歸時傳入一個自增變量,達到阈值時停止遞歸,執行最外層時無需傳參,默認值為0,且可根據t的值判斷當前的遞歸層數,可以在遞歸結束時,在最外層執行完之前做其他事情,一舉兩得。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持軟件開發網。