Python:函數遞歸


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM