首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言遞迴函數詳解:age(5) 逐層展開與堆疊模型圖解

     編輯:程式設計綜合問答

題目代碼(重建)

int age(int n) {
    if (n == 1) return 10;
    else return age(n - 1) + 2;
}
// main 中呼叫 age(5)

遞迴展開過程

呼叫層級n 值條件判斷回傳表達式實際回傳值
第 1 層5n != 1age(4) + 2待定
第 2 層4n != 1age(3) + 2待定
第 3 層3n != 1age(2) + 2待定
第 4 層2n != 1age(1) + 2待定
第 5 層(基底)1n == 11010

回傳值回溯計算

age(1) = 10
age(2) = age(1) + 2 = 10 + 2 = 12
age(3) = age(2) + 2 = 12 + 2 = 14
age(4) = age(3) + 2 = 14 + 2 = 16
age(5) = age(4) + 2 = 16 + 2 = 18

最終結果:18

堆疊幀模型圖解

呼叫堆疊增長階段:
main() → age(5) → age(4) → age(3) → age(2) → age(1) [基底案例]

呼叫堆疊縮減階段(回傳值傳遞):
age(1) 回傳 10 → age(2) 計算 12 → age(3) 計算 14 → age(4) 計算 16 → age(5) 計算 18 → main 接收 18

遞迴三要素檢核

  1. 基底案例:n == 1 直接回傳 10,避免無限遞迴
  2. 遞迴規則:age(n) = age(n-1) + 2,問題規模遞減
  3. 收斂性:n 每次 -1,必然觸達基底案例

迭代版等價代碼(避免堆疊溢位)

int age_iterative(int n) {
    int result = 10;  // age(1)
    for (int i = 2; i <= n; i++) {
        result += 2;
    }
    return result;
}
// 或直接數學公式:age(n) = 10 + 2*(n-1) = 2n + 8

遞迴除錯技巧

  • 加入 printf("age(%d) called\n", n) 觀察呼叫順序
  • 使用 IDE 條件斷點:n == 1 暫停檢查堆疊
  • 手動畫堆疊圖,標註每層參數與回傳值

總結

遞迴本質是「將問題分解為相同結構的子問題,直到最簡單情況」。本題 age(5) 經過 5 層呼叫、4 次 +2 運算,最終得 18。理解堆疊幀建立與銷毀過程,是掌握遞迴、動態規劃、分治演算法的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved