Python:函數遞歸
定義:在調用一個函數的過程中直接或間接的調用該函數本身,稱之為遞歸調用。遞歸調用最多能調用999層。
基礎模型:
def func(): print('from func') func() #直接調用自身 func():
def func(): print('from func') bar() #間接調用自身 def bar(): print("from bar") func() func()
雖然以上兩中方式為函數遞歸的基礎模型,但往往不能直接這樣使用。因為沒有一個函數的結束條件,僅僅相當於一個死循環。
遞歸分為兩個重要的階段: 遞推+回溯
遞推:函數不斷減少問題規模直至最終的終止條件。
回溯:拿到最終明確的值后,返回給上次調用進行處理,直至初始層。
練習題:解決年齡問題,求出alex的年齡
""" alex 他比佩奇 大兩歲。 4 age(3) + 2 佩奇 他比日天 大兩歲。 3 age(2) + 2 日天 他比太白 大兩歲。 2 age(1) + 2 太白:我今年23. 1 23 """ def age(n): if n == 1: return 23 else: return age(n-1) + 2 print(age(4)) #這里的4表示解決問題的規模
29
流程分析:
""" def age(4): if n == 1: return 23 else: return age(3) + 2 23 + 2 + 2 + 2 def age(3): if n == 1: return 23 else: return age(2) + 2 23 + 2 + 2 def age(2): if n == 1: return 23 else: return age(1) + 2 23 + 2 def age(1): if n == 1: return 23 else: return age(0) + 2 """
注意在Python:
1、遞歸調用必須有一個明確的結束條件
2、在python中沒有尾遞歸優化,遞歸調用的效率不高
3、進入下一次遞歸時,問題的規模必須降低
簡單應用場景:
取出列表 l=[1,2,[3,[4,[5,[6,[7,[8,9,[10]]]]]]]] 中的所有元素
def get(l): for item in l: if isinstance(item, list): get(item) #如果元素為一個列表,那么遞歸調用自己把該列表傳給get()函數,進行遞歸調用 else: print(item)
get(l)