五人同坐,第五人比第四人大 2 歲,第四人比第三人大 2 歲,第三人比第二人大 2 歲,第二人比第一人大 2 歲,第一人 10 歲。求第五人年齡。
設 age(n) 為第 n 人年齡,則:
age(1) = 10age(n) = age(n-1) + 2(n > 1)目標求 age(5)。
#include <stdio.h>
int age(int n) {
if (n == 1)
return 10;
else
return age(n - 1) + 2;
}
int main() {
printf("his age is :%d\n", age(5));
return 0;
}
調用棧(遞推階段): age(5) → age(4) → age(3) → age(2) → age(1) 返回 10 返回棧(回推階段): age(2) = 10 + 2 = 12 age(3) = 12 + 2 = 14 age(4) = 14 + 2 = 16 age(5) = 16 + 2 = 18
his age is :18
| 維度 | 遞歸版 | 迭代版 |
|---|---|---|
| 代碼行數 | 6 行 | 4 行 |
| 空間複雜度 | O(n) 棧幀 | O(1) |
| 可讀性 | 符合數學定義 | 需理解循環不變量 |
| 棧溢出風險 | n 極大時存在 | 無 |
int age_iter(int n) {
int a = 10;
for (int i = 2; i <= n; i++)
a += 2;
return a;
}
將加法操作前移,使遞歸調用成為函數最後一條指令:
int age_tail(int n, int acc) {
if (n == 1) return acc;
return age_tail(n - 1, acc + 2);
}
// 調用:age_tail(5, 10)
支持尾調用優化(TCO)的編譯器(GCC -O2/-O3、Clang、MSVC)可將其轉為迭代機器碼,消除棧增長。