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

C++ 遞迴函數逐步執行圖解:age(5) 呼叫堆疊與返回值傳遞

     編輯:程式設計疑難解答

初學者常對遞迴「層層呼叫、層層返回」感到困惑。以 `age(n)` 遞迴函數為例,詳細拆解呼叫堆疊、參數傳遞、返回值回傳的完整過程。

代碼

int age(int n) {
    int c;
    if (n == 1) {
        c = 10;
        cout << n << endl;  // 印 1
    } else {
        c = age(n - 1) + 2;
    }
    return c;
}
// main 呼叫 age(5)

呼叫堆疊演進 (時間軸)

步驟動作堆疊狀態 (顯示 n 值)備註
1main 呼叫 age(5)[5]
2age(5) 進入,n!=1 → 呼叫 age(4)[5, 4]暫停 age(5),等待 age(4) 返回
3age(4) → 呼叫 age(3)[5, 4, 3]
4age(3) → 呼叫 age(2)[5, 4, 3, 2]
5age(2) → 呼叫 age(1)[5, 4, 3, 2, 1]
6age(1) 滿足基礎情況,**返回 10**[5, 4, 3, 2] ← 彈出 1印 1,c=10 返回給 age(2)
7age(2) 收到 10,**c = 10 + 2 = 12**,返回 12[5, 4, 3] ← 彈出 2
8age(3) 收到 12,**c = 12 + 2 = 14**,返回 14[5, 4] ← 彈出 3
9age(4) 收到 14,**c = 14 + 2 = 16**,返回 16[5] ← 彈出 4
10age(5) 收到 16,**c = 16 + 2 = 18**,返回 18 給 main[] ← 彈出 5最終結果 18

關鍵概念

  • 基礎情況:`if (n == 1) return 10;` —— 遞迴終止條件,沒有它會無限遞迴導致 Stack Overflow
  • 遞迴步驟:`return age(n-1) + 2;` —— 將問題縮小,並對子問題結果做處理
  • 呼叫堆疊:每次呼叫在棧幀保存區域變數 (`n`, `c`) 和返回位址,記憶體隨深度線性增長
  • 返回值傳遞:子呼叫返回值賦給父呼叫的區域變數 `c`,再加工後向上返回

數學歸納法對應關係

age(1) = 10
age(n) = age(n-1) + 2  (n > 1)

推導:
age(2) = age(1) + 2 = 12
age(3) = age(2) + 2 = 14
age(4) = 16
age(5) = 18
通項:age(n) = 10 + 2*(n-1) = 2n + 8

除錯技巧:印出呼叫深度

int age(int n, int depth = 0) {
    string indent(depth * 2, ' ');
    cout << indent << "-> age(" << n << ")" << endl;
    int c;
    if (n == 1) { c = 10; }
    else { c = age(n-1, depth+1) + 2; }
    cout << indent << "<- age(" << n << ") returns " << c << endl;
    return c;
}
// 輸出清晰展開/收合過程

遞迴 vs 迭代

特性遞迴迭代
可讀性數學定義直觀需手動管理狀態變數
記憶體O(n) 棧空間O(1) 常數空間
效能函數呼叫開銷極快
適用樹/圖遍歷、分治、動態規劃簡單線性累加

理解「向下遞迴拆解問題、向上回溯組裝答案」的雙向流程,配合除錯印出堆疊深度,即可掌握任意遞迴函數的執行邏輯。

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