算法圖解系列之遞歸[03]

3 遞歸

3.1 遞歸<函數(shù)>

// MARK: 3.1 遞歸
/*
 階乘
 */
func factorial(_ parameter: Int) -> Int {
    // 基線條件
    guard parameter > 1 else {
        print("Base Case \(parameter)")
        return parameter
    }
    print(parameter)
    // 遞歸條件
   return parameter * factorial(parameter - 1)
}

print("Final result is : \(factorial(3))")

3.2 基線條件和遞歸條件

// MARK: - 3.2 基線條件和遞歸條件
// FIXME: 1. 遞歸條件是指函數(shù)調(diào)用自己.
// FIXME: 2. 基線條件則是指函數(shù)不再調(diào)用自己, 從而避免形成無限循環(huán).

// MARK: - 3.3.1 棧<調(diào)用棧>
// FIXME: 棧: 是一種簡單的數(shù)據(jù)結(jié)構(gòu).
// FIXME: e.g.
func greet(_ name: String) -> Void {
    // 2. 為hello函數(shù)分配內(nèi)存并壓入棧
    hello(name)
    // 3. hello執(zhí)行完成, 將hello函數(shù)從棧中彈出, 并釋放內(nèi)存
    // 4. 為bye函數(shù)分配內(nèi)存并壓入棧
    bye(name)
    // 5. bye函數(shù)執(zhí)行完成, 將hello函數(shù)從棧中彈出(移除), 并釋放內(nèi)存
}

private func hello(_ name: String) {
    print("Hello \(name)!")
}

private func bye(_ name: String) {
    print("bye, \(name)~")
}

// 1. 此時(shí)為greet函數(shù)分配內(nèi)存并壓入調(diào)用棧, 并加參數(shù)'Jim"存儲(chǔ)到內(nèi)存中
greet("Jim")
// 6. greet函數(shù)執(zhí)行完成, 將其從棧中彈出, 并釋放

3.3 遞歸調(diào)用棧

// MARK: - 3.3.2 遞歸調(diào)用棧
// TODO: 本小節(jié), 拿3.1中的 factorial 函數(shù)說明
// FIXME: 1. 當(dāng)調(diào)用  factorial(3)時(shí), 此時(shí)的函數(shù)調(diào)用棧

/*
 內(nèi)部執(zhí)行順序如下:
 factorial(3)
 3 * factorial(2)
 3 * (2 * factorial(1))
 3 * (2 * 1)
 3 * 2
 6
 
 // FIXME: 上述過程的長度可以看做是內(nèi)存的峰值曲線.
 
 解釋: 調(diào)用3時(shí), 3內(nèi)調(diào)用2, 3等待2完成; 2內(nèi)調(diào)用1, 2等待1完成; 1內(nèi)調(diào)用0,    1等待0完成. 當(dāng)調(diào)用到0時(shí), 0滿足了基線條件, 此時(shí) factorial(0)執(zhí)行完成, 從棧中彈出, 并釋放內(nèi)存; 接著 factorial(1)的執(zhí)行完成, 從棧中彈出并釋放內(nèi)存; 接著依次類推到棧底 factorial(3)的執(zhí)行完成, 從棧中彈出并釋放內(nèi)存.
 */

// FIXME: PS: 當(dāng)使用遞歸時(shí), 每一次遞歸都棧都需要分配內(nèi)存, 如果調(diào)用棧過長或無限循環(huán),  將占用大量的內(nèi)存或內(nèi)存不夠的情況.

// TODO: 如果遇到上述情景, 你有兩種選擇. 1) 重寫代碼, 轉(zhuǎn)而使用循環(huán). 2) 使用尾遞歸<這是一個(gè)高級(jí)遞歸, 內(nèi)存的使用是恒量的, 但是部分語言不支持尾遞歸優(yōu)化, C 可以.>.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 計(jì)算機(jī)科學(xué)的新學(xué)生通常難以理解遞歸程序設(shè)計(jì)的概念。遞歸思想之所以困難,原因在于它非常像是循環(huán)推理(circular...
    啟明_b56f閱讀 7,684評(píng)論 0 20
  • 前言 幾個(gè)月之前就想寫這樣一篇文章分享給大家,由于自己有心而力不足,沒有把真正的學(xué)到的東西沉淀下來,所以一直在不斷...
    小鹿動(dòng)畫學(xué)編程閱讀 1,771評(píng)論 2 14
  • 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大獎(jiǎng):點(diǎn)擊這里領(lǐng)取 在...
    HetfieldJoe閱讀 1,886評(píng)論 0 14
  • 一、遞歸定義 如果函數(shù)中包含了對其自身的調(diào)用,該函數(shù)就是遞歸的; 遞歸(Recursion),在數(shù)學(xué)與計(jì)算機(jī)科學(xué)中...
    惑也閱讀 11,279評(píng)論 0 4
  • 不是每一個(gè)夜晚都適合看散文,品讀那樣清淡的文字,體悟來自靈魂的嘆息。 也許看散文需要一杯茶,或者咖啡?。需要不明不...
    咖啡遇茶閱讀 609評(píng)論 19 11

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