int age(int n) {
if (n == 1) return 10;
else return age(n - 1) + 2;
}
// main 中呼叫 age(5)
| 呼叫層級 | n 值 | 條件判斷 | 回傳表達式 | 實際回傳值 |
|---|---|---|---|---|
| 第 1 層 | 5 | n != 1 | age(4) + 2 | 待定 |
| 第 2 層 | 4 | n != 1 | age(3) + 2 | 待定 |
| 第 3 層 | 3 | n != 1 | age(2) + 2 | 待定 |
| 第 4 層 | 2 | n != 1 | age(1) + 2 | 待定 |
| 第 5 層(基底) | 1 | n == 1 | 10 | 10 |
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
n == 1 直接回傳 10,避免無限遞迴age(n) = age(n-1) + 2,問題規模遞減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) 觀察呼叫順序n == 1 暫停檢查堆疊遞迴本質是「將問題分解為相同結構的子問題,直到最簡單情況」。本題 age(5) 經過 5 層呼叫、4 次 +2 運算,最終得 18。理解堆疊幀建立與銷毀過程,是掌握遞迴、動態規劃、分治演算法的基石。