首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C語言函數嵌套調用與遞歸調用核心原理:從階乘到漢諾塔的完整演示

     編輯:C 語言基礎

函數嵌套調用

C 不允許嵌套定義,但允許嵌套調用:main → a → b,執行流為 main 調 a,a 調 b,b 返回 a,a 返回 main。關係圖呈樹狀層級。

遞歸調用:函數調用自身

需有終止條件(基例),否則無限遞歸導致棧溢出。每次遞歸進入新層,滿足終止條件後逐層返回。

範例 1:遞歸計算階乘 n!

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。

範例 2:漢諾塔問題(經典遞歸)

移動 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 變量分區域(局部)與全局兩大類,作用域決定可見範圍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved