算法圖解-遞歸

1. 遞歸指的是調(diào)用自己的函數(shù)
遞歸函數(shù)有兩部分:基線條件(base case)和遞歸條件(recursive case)。遞歸條件指的是函數(shù)調(diào)用自己,而基線條件則指的是函數(shù)不再調(diào)用自己,從而避免形成無限循環(huán)。

def countdown(i):
    print(i)
    if i <= 0: # 基線條件
        return
    else: # 遞歸條件
        countdown(i-1)
countdown(5)

運(yùn)行結(jié)果如下:

運(yùn)行結(jié)果.png

2. 棧(stack)
遞歸函數(shù)factorial的調(diào)用棧(call stack)。factorial(5)寫作5!,其定義如下:5! = 5 * 4 * 3 * 2 * 1。同理,factorial(3)為3 * 2 * 1。下面是計(jì)算階乘的遞歸函數(shù)。

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x - 1)
print(fact(5))
# 輸出結(jié)果為 120

小結(jié)

  • 棧有兩種操作:壓入和彈出
  • 所有函數(shù)調(diào)用都進(jìn)入調(diào)用棧
  • 使用棧雖然很方便,但是也要付出代價(jià):存儲(chǔ)詳盡的信息可能占用大量的內(nèi)存。每個(gè)函數(shù)調(diào)用都要占用一定的內(nèi)存,如果棧很高,就意味著計(jì)算機(jī)存儲(chǔ)了大量函數(shù)調(diào)用的信息。
  • Leigh Caldwell在Stack Overflow上說的一句話:“如果使用循環(huán),程序的性能可能更高;如果使用遞歸,程序可能更容易理解。如何選擇要看什么對(duì)你來說更重要。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容