遞歸是函數直接或間接調用自身,解決階乘、斐波那契、樹遍歷等自我相似問題的利器。
n! = n × (n-1)! (n > 1)
1! = 1(基準情況)
#include <stdio.h>
// 遞歸函數
int factorial(int n) {
if (n == 1) // 基準情況:遞歸終止條件
return 1;
return n * factorial(n - 1); // 遞歸步驟:問題規模縮小
}
int main() {
int n;
printf("請輸入正整數 n: ");
if (scanf("%d", &n) != 1 || n < 1) {
printf("輸入無效\n");
return 1;
}
printf("%d! = %d\n", n, factorial(n));
return 0;
}
factorial(4)
→ 4 * factorial(3)
→ 3 * factorial(2)
→ 2 * factorial(1)
→ 返回 1
→ 返回 2*1 = 2
→ 返回 3*2 = 6
→ 返回 4*6 = 24
| 要素 | 階乘實現 | 檢查 |
|---|---|---|
| 基準情況 | if (n == 1) return 1; | ✅ 有明確終止條件 |
| 遞歸步驟 | n * factorial(n-1) | ✅ 規模遞減,趨向基準 |
| 問題分解 | n! 分解為 n × (n-1)! | ✅ 子問題結構相同 |
13! 超過 32 位有符號整數範圍,用 long long 或大數庫long long fact_iter(int n) {
long long r = 1;
for (int i = 2; i <= n; i++) r *= i;
return r;
}