遞迴是函數在其函數體內直接或間接呼叫自身的技術。Turbo C 2.0 完整支援遞迴調用。遞迴能將複雜問題分解為同構的子問題,代碼極為精簡,但以堆疊記憶體為代價——每次調用佔用一層堆疊幀。
n! 計算n! = 1 (n = 0 或 1)
n! = n × (n-1)! (n > 1)
#include <stdio.h>
#include <conio.h>
unsigned long factorial(int n); // 函數原型宣告
int main(void) {
int m;
puts("Calculate n! n=?");
scanf("%d", &m);
printf("%d! = %lu\n", m, factorial(m));
getch();
return 0;
}
unsigned long factorial(int n) {
if (n > 1)
return n * factorial(n - 1); // 遞迴呼叫
else
return 1UL; // 基礎情況
}
factorial(5)factorial(5)
= 5 * factorial(4)
= 5 * (4 * factorial(3))
= 5 * 4 * (3 * factorial(2))
= 5 * 4 * 3 * (2 * factorial(1))
= 5 * 4 * 3 * 2 * 1
= 120
每層調用在堆疊保存 n 與返回位址,基礎情況返回後逐層展開相乘。
| 要素 | 說明 | 階乘範例 |
|---|---|---|
| 基礎情況 | 終止遞迴的條件,不再呼叫自身 | n <= 1 返回 1 |
| 遞迴步驟 | 問題規模縮小並呼叫自身 | n * factorial(n-1) |
| 縮小保證 | 每次調用必須向基礎情況收斂 | n-1 單調遞減 |
遞迴是把雙面刃:善用能寫出極具數學美感的代碼,濫用則導致堆疊崩潰與效率災難。理解「基礎情況、遞迴步驟、縮小保證」三要素,並在實作前評估堆疊深度,是駕馭遞迴的關鍵。