天天看點

【C語言進階剖析】47、遞歸函數分析

遞歸是一種數學上分而治之的思想,将大型問題轉化為與原問題小童但規模較小的問題進行處理。遞歸需要有邊界條件,滿足邊界條件時,遞歸停止。

遞歸函數内部自己調用自己,遞歸函數必有要有出口,否則将無限遞歸而使得程式棧溢出而崩潰。

執行個體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語言進階剖析】47、遞歸函數分析

問題分析:

可以将問題分解:

首先借助 c 由 a 上的 n-1 個盤子移動 b 上;

再将 a 上最後一個盤子移動到 c 上;

最後借助 a 将 b 上的 n-1 個盤子移動到 c上。

總結:

遞歸是一種分而治之的思想,一定要找到邊界條件和遞歸公式