解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問(wèn)題
遞歸函數(shù)及遞歸次數(shù)受到限制
一個(gè)函數(shù)在內(nèi)部調(diào)用自己,那么這個(gè)函數(shù)是遞歸函數(shù)。遞歸會(huì)反復(fù)使用本身,每遞歸一次,越接近最終的值。當(dāng)一個(gè)問(wèn)題可以由許多相似的小問(wèn)題解決, 可以考慮使用遞歸函數(shù)。隨著遞歸的深入,問(wèn)題規(guī)模相比上次都應(yīng)所減小。return函數(shù)本身的方法保證了遞歸的持續(xù)進(jìn)行,但是如果沒(méi)有明確的結(jié)束條件,遞歸會(huì)無(wú)限進(jìn)行下去。所以當(dāng)已經(jīng)到了問(wèn)題解決的程度, 應(yīng)該告訴函數(shù)結(jié)束遞歸,這就需要明確的結(jié)束條件。
常見(jiàn)的兩個(gè)遞歸例子:求和、求階乘n!
求和:sum=n+n(n-1)+…+1
def sum(n): ? ? if n > 0: ? ? ? ? ? ? ? ? ? ? ? return n+sum(n-1) ? ? else: ? ? ? ? return 0 ? ? ? ? ?? new_sum = sum(10) print(new_sum) #output 55
求階乘:n!=1x2x3…xn
def factorial(n): ? ? if n == 1: ? ? ? ? return 1 ? ? else: ? ? ? ? return n*factorial(n-1) new_sum = factorial(5) print(new_sum) #output 120
使用遞歸函數(shù)需要注意遞歸次數(shù)默認(rèn)限制為1000,如果遞歸次數(shù)較多會(huì)導(dǎo)致棧溢出的問(wèn)題
比如
def sum(n): ? ? if n > 0: ? ? ? ? return 1+sum(n-1) ? ? ? else: ? ? ? ? return 0 new_sum = sum(1000) print(new_sum)
會(huì)報(bào)RecursionError: maximum recursion depth exceeded in comparison的錯(cuò)誤
解決問(wèn)題的辦法是修改可遞歸的次數(shù)
import sys sys.setrecursionlimit(1500)#可遞歸次數(shù)修改為1500 def sum(n): ? ? if n > 0: ? ? ? ? return 1+sum(n-1) ? ? ? else: ? ? ? ? return 0 new_sum = sum(1000) print(new_sum) #output 1000
修改遞歸次數(shù)時(shí)需要注意,修改可遞歸次數(shù)為1500,遞歸深度到不了1500,在1400左右。默認(rèn)可遞歸次數(shù)為1000,遞歸深度也到不了1000,到992左右
如何控制遞歸的次數(shù)
經(jīng)常會(huì)用到遞歸,雖然能解決很多問(wèn)題,但其缺點(diǎn)很明顯,有可能無(wú)法跳出造成死循環(huán),能控制遞歸次數(shù)就可以避免這種情況。
用lua嘗試了幾種方法,
第一種
在方法內(nèi)定義一個(gè)變量計(jì)數(shù):
function recursionTest() ? ? local times = 0 ? ? if times < 10 then ? ? ? ? times = times + 1 ? ? ? ? recursionTest() ? ? end ? ? if times == 0 then ? ? ? ? print("outer round") ? ? end end
執(zhí)行下來(lái),是無(wú)法限制的,因?yàn)榫植孔兞棵看味紩?huì)重置為0。
第二種
local recurTimes = 0 function recursionTest2() ? ? if recurTimes < 10 then ? ? ? ? recurTimes = recurTimes + 1 ? ? ? ? recursionTest2() ? ? end end
這種方法可以控制次數(shù),但是變量需要定義在方法體外,執(zhí)行函數(shù)前都需要先把這個(gè)變量設(shè)為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") ? ? end end
在遞歸時(shí)傳入一個(gè)自增變量,達(dá)到閾值時(shí)停止遞歸,執(zhí)行最外層時(shí)無(wú)需傳參,默認(rèn)值為0,且可根據(jù)t的值判斷當(dāng)前的遞歸層數(shù),可以在遞歸結(jié)束時(shí),在最外層執(zhí)行完之前做其他事情,一舉兩得。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python開(kāi)發(fā)微信服務(wù)號(hào)消息推送示例
這篇文章主要為大家介紹了python開(kāi)發(fā)微信服務(wù)號(hào)消息推送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Python pkg_resources模塊動(dòng)態(tài)加載插件實(shí)例分析
當(dāng)編寫應(yīng)用軟件時(shí),我們通常希望程序具有一定的擴(kuò)展性,額外的功能——甚至所有非核心的功能,都能通過(guò)插件實(shí)現(xiàn),具有可插拔性。特別是使用 Python 編寫的程序,由于語(yǔ)言本身的動(dòng)態(tài)特性,為我們的插件方案提供了很多種實(shí)現(xiàn)方式2022-08-08淺談python str.format與制表符\t關(guān)于中文對(duì)齊的細(xì)節(jié)問(wèn)題
今天小編就為大家分享一篇淺談python str.format與制表符\t關(guān)于中文對(duì)齊的細(xì)節(jié)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖示例
這篇文章主要介紹了Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖,結(jié)合實(shí)例形式詳細(xì)分析了Python使用matplotlib進(jìn)行統(tǒng)計(jì)圖繪制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11python實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)間數(shù)據(jù)同步功能
這篇文章主要介紹了python實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)間數(shù)據(jù)同步功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02python使用selenium打開(kāi)chrome瀏覽器時(shí)帶用戶登錄信息實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了python使用selenium打開(kāi)chrome瀏覽器時(shí)帶用戶登錄信息,本文以實(shí)例給大家來(lái)展示如何讓selenium在打開(kāi)chrome瀏覽器的時(shí)候帶上用戶的登錄信息,感興趣的朋友跟隨小編一起看看吧2022-02-02Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
這篇文章主要介紹了Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù),主要通過(guò)三個(gè)問(wèn)題如何創(chuàng)建SQLite數(shù)據(jù)庫(kù)?如何向SQLite表中插入數(shù)據(jù)?如何查詢SQLite表中的數(shù)據(jù)?展開(kāi)文章主題詳情,需要的朋友可以參考一下2022-06-06