算法圖解之遞歸


遞歸就是不斷調用自己,讓解決方案更清晰,但是沒有性能上的優勢。使用情景參考Stack Overflow的一個答案:“如果使用循環,程序的性能可能更高;如果使用遞歸,程序可能更容易理解。如何選擇要看什么對你來說更重要。”

基線條件和遞歸條件

每個遞歸函數都有兩部分:基線條件 (base case)和遞歸條件 (recursive case)。遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。”

def countdown(i):
    print(i)
    if i <= 0:  # Base case
        return
    else:  # Recursive case
        countdown(i - 1)

 

實例1:factorial

def max_num(list):
    if len(list) == 2:
        return list[0] if list[0] > list[1] else list[1]

    sub_max = max_num(list[1:])
    return list[0] if list[0] > sub_max else sub_max


print(max_num([1, 100, 22, 333, 31, 12]))

 

假如你要寫一系列待辦事項的清單,每寫一個清單就把一個便條放在桌子上,當你開始讀取清單的時候,你從最上面的一張開始讀,並將其刪除。因此這個待辦事項清單只有兩種操作:壓入 (插入)和彈出(刪除並讀取)。這種數據結構稱為棧。

 

調用棧

def green(name):
    print('hello,', name)
    greet2(name)
    print('getting ready to say bye......')
    bye()


def greet2(name):
    print('how are you,', name)


def bye():
    print('ok bye')


green('Maggie')

當調用green('edward')的時候,計算機將首先為該函數調用分配一塊內存。

 

使用這些內存的時候,變量name就被設置為edward並儲存到內存中。

 

當調用greet2的時候,計算機也會為這個函數調用分配一塊內存。

 

 

當調用greet2的時候,當前函數(greet)暫停並處於未完成狀態,該函數的所有變量值還是在內存中。

執行完greet2后,回到greet函數繼續執行

首先打印getting ready to say bye…,再調用 函數bye。


免責聲明!

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



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