python基礎(chǔ)學(xué)習(xí)之遞歸函數(shù)知識(shí)總結(jié)
一、遞歸函數(shù)使用注意點(diǎn)
遞歸函數(shù)一定要編寫(xiě)終止條件,否則將產(chǎn)生無(wú)限遞歸。(死循環(huán))
二、遞歸的效率問(wèn)題
- 遞歸效率不高,遞歸層次過(guò)多會(huì)導(dǎo)致棧溢出。
- Python中不推薦使用遞歸。
三、遞歸函數(shù)引入
""" 使用代碼循環(huán)輸出故事:從前有座山,山里有座廟... """ # ------------while循環(huán) (暫時(shí)忽略死循環(huán))--------------- while True: print("從前有座山,山里有座廟...") # ---------------通過(guò)定義一個(gè)方法, 在while循環(huán)里面調(diào)用實(shí)現(xiàn)( 暫時(shí)忽略死循環(huán))--------------- def func_story(): print("從前有座山,山里有座廟...") while True: func_story() # ---------------使用遞歸的方法實(shí)現(xiàn)循環(huán)--------------- def story(): print("從前有座山,山里有座廟...") story() story() # 報(bào)錯(cuò):RecursionError: maximum recursion depth exceeded while calling a Python object
四、遞歸的深度
這里就引申到一個(gè)遞歸的最大深度。
import sys # 獲取最大遞歸深度 res = sys.getrecursionlimit() print(res) # 輸出:1000 # 遞歸最大深度: def func(n): print(n) n += 1 func(n) func(1) # python 3 打印到998就停止打印了
我們可以設(shè)置遞歸的最大深度。但是能夠達(dá)到的最大深度,跟電腦配置也有關(guān)系:
import sys # 設(shè)置遞歸的深度 sys.setrecursionlimit(10000) # 遞歸最大深度: def func(n): print(n) n += 1 func(n) func(1) # python 3 打印到3221就停止打印了
五、通過(guò)緩存解決遞歸限制
通過(guò)緩存解決最大遞歸限制的問(wèn)題:
- Python的functools模塊中提供了很多高階函數(shù)的操作。
- lru_cache:緩存功能裝飾器,能夠緩存相同參數(shù)的函數(shù)調(diào)用結(jié)果,可以節(jié)約高開(kāi)銷(xiāo)或I/O函數(shù)的調(diào)用時(shí)間。
- 通過(guò)lru_cache裝飾遞歸函數(shù)
六、遞歸函數(shù)使用示例
遞歸函數(shù)示例一:
# 18 20 22 24 def age(n): if n == 1: return 18 else: return age(n-1) + 2 print(age(1)) # 輸出:18 print(age(2)) # 輸出:20 print(age(3)) # 輸出:22 print(age(4)) # 輸出:24
遞歸函數(shù)示例二:打印三級(jí)菜單
# 我們有一個(gè)這樣的三級(jí)菜單 menu = { "功能測(cè)試": { "用例管理": { "添加用例": {}, "刪除用例": {}, "復(fù)制用例": {} }, "元素管理": { "添加元素": {}, "刪除元素": {}, "復(fù)制元素": {} }, }, "接口測(cè)試": { "API管理": { "添加api": {}, "刪除api": {}, "復(fù)制api": {} }, "環(huán)境管理": { "添加環(huán)境": {}, "刪除環(huán)境": {}, "復(fù)制環(huán)境": {} }, }, } def query_menu(menu:dict): """ 一級(jí)級(jí)查詢(xún)菜單信息 :return: """ # 用戶(hù)輸入q退出 while True: for k in menu:print(f"當(dāng)前菜單:{k}") key = input(">>>").strip() if key == "q": return key elif key in menu.keys() and menu[key]: res = query_menu(menu[key]) if res == "q": return "q" query_menu(menu)
輸出結(jié)果:
到此這篇關(guān)于python基礎(chǔ)學(xué)習(xí)之遞歸函數(shù)知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)python遞歸函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
selenium常用API的使用過(guò)程記錄(包括自動(dòng)登錄)
selenium是一個(gè)自動(dòng)測(cè)試工具,它可以幫我通過(guò)代碼去實(shí)現(xiàn)驅(qū)動(dòng)瀏覽器自動(dòng)執(zhí)行相應(yīng)的操作,所以我們也可以用它來(lái)做爬蟲(chóng),主要使用selenium的目的是為了跳過(guò)登錄驗(yàn)證,這篇文章主要介紹了selenium的使用過(guò)程記錄,已經(jīng)常用API接口(包括自動(dòng)登錄)2024-02-02python?rpyc客戶(hù)端調(diào)用服務(wù)端方法的注意說(shuō)明
這篇文章主要介紹了python?rpyc客戶(hù)端調(diào)用服務(wù)端方法的注意說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06TensorFlow人工智能學(xué)習(xí)按索引取數(shù)據(jù)及維度變換詳解
這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)按索引取數(shù)據(jù)及維度變換的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法分析
這篇文章主要介紹了Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法,結(jié)合實(shí)例形式分析了Python3.6針對(duì)mysql或mariadb數(shù)據(jù)庫(kù)操作的相關(guān)模塊安裝、數(shù)據(jù)庫(kù)與表的創(chuàng)建、數(shù)據(jù)庫(kù)連接等操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05Django模板標(biāo)簽{% for %}循環(huán),獲取制定條數(shù)據(jù)實(shí)例
這篇文章主要介紹了Django模板標(biāo)簽{% for %}循環(huán),獲取制定條數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python中partial()基礎(chǔ)用法說(shuō)明
這篇文章主要給大家介紹了關(guān)于python中partial()基礎(chǔ)用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-12-12Python3調(diào)用百度AI識(shí)別圖片中的文字功能示例【測(cè)試可用】
這篇文章主要介紹了Python3調(diào)用百度AI識(shí)別圖片中的文字功能,結(jié)合實(shí)例形式分析了Python3安裝及使用百度AI接口的相關(guān)操作技巧,并附帶說(shuō)明了百度官方AI平臺(tái)的注冊(cè)及接口調(diào)用操作方法,需要的朋友可以參考下2019-03-03