程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

解決python遞歸函數及遞歸次數受到限制的問題

編輯:Python

目錄

遞歸函數及遞歸次數受到限制

求和: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的值判斷當前的遞歸層數,可以在遞歸結束時,在最外層執行完之前做其他事情,一舉兩得。 

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持軟件開發網。



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved