C 不允許嵌套定義,但允許嵌套調用:main → a → b,執行流為 main 調 a,a 調 b,b 返回 a,a 返回 main。關係圖呈樹狀層級。
需有終止條件(基例),否則無限遞歸導致棧溢出。每次遞歸進入新層,滿足終止條件後逐層返回。
long ff(int n) {
if (n < 0) printf("錯誤");
else if (n == 0 || n == 1) return 1;
else return ff(n-1) * n;
}
main() { int n; scanf("%d",&n); printf("%d!=%ld", n, ff(n)); }
輸入 5:ff(5) → ff(4) → ff(3) → ff(2) → ff(1)=1 → 返回 2,6,24,120。
移動 n 個盤子從 A 經 B 到 C,規則:大盤不壓小盤。
遞歸策略:
1. 將 n-1 個從 A 移到 B(借助 C)
2. 將第 n 個從 A 移到 C
3. 將 n-1 個從 B 移到 C(借助 A)
void move(int n, char x, char y, char z) {
if (n == 1) printf("%c-->%c\n", x, z);
else {
move(n-1, x, z, y);
printf("%c-->%c\n", x, z);
move(n-1, y, x, z);
}
}
main() { int h; scanf("%d",&h); move(h,'a','b','c'); }
n=4 時輸出 15 步移動序列,完美演示遞歸分解威力。
形參僅在調用期間存在,屬局部變量。C 變量分區域(局部)與全局兩大類,作用域決定可見範圍。