遞歸是一種數學上分而治之的思想,将大型問題轉化為與原問題小童但規模較小的問題進行處理。遞歸需要有邊界條件,滿足邊界條件時,遞歸停止。
遞歸函數内部自己調用自己,遞歸函數必有要有出口,否則将無限遞歸而使得程式棧溢出而崩潰。
執行個體1:遞歸求解字元串的長度
邊界條件:目前字元為 ‘\0’
遞推公式:strlen_r(s) = 1 + strlen_r(s + 1),目前字元後面的字元串長度加 1
執行個體2:斐波那契數列
1,1,2,3,5,8,13,21,……
第一個第二個數字為1,後面每一個數字都等于前兩個數字的和,求前 n 個斐波那契數。
邊界條件:求第一個第二個數時,直接傳回 1
遞推公式:fac(n) = fac(n-1) + fac(n - 2)
執行個體3:漢諾塔問題
有 a、b、c 三個塔座,a 座上有 n 個盤子,盤子大小不等,大的在下,小的在上。把這 n 個盤子從 a 座移到 c 座,但每次隻能允許移動一個盤子,并且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。在移動過程中可以利用 b 座,要求輸出移動的步驟。
問題分析:
可以将問題分解:
首先借助 c 由 a 上的 n-1 個盤子移動 b 上;
再将 a 上最後一個盤子移動到 c 上;
最後借助 a 将 b 上的 n-1 個盤子移動到 c上。
總結:
遞歸是一種分而治之的思想,一定要找到邊界條件和遞歸公式