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

C 語言自定義函數完全指南:四類函數結構、遞歸實戰(階乘/斐波那契)、參數傳遞機制

     編輯:關於C語言

C 語言自定義函數完全指南

函數是 C 語言模塊化編程的基本單元。本文系統講解四類函數結構、參數與返回值機制、遞歸函數經典實戰、聲明定義調用規範,助你掌握函數設計精髓。

一、函數四大類型分類

類型參數返回值聲明示例適用場景
無參無返無voidvoid sayHi();固定流程、初始化、打印菜單
有參無返有voidvoid drawRect(int w, int h);輸出型操作、狀態設置、回調處理
無參有返無非 voidint getRandom();獲取狀態、工廠函數、輸入讀取
有參有返有非 voidint add(int a, int b);計算、轉換、查詢、核心邏輯

二、完整代碼實戰

1. 無參無返:問候函數

void sayHi() { printf("你好!\n"); }

2. 有參無返:繪製空心矩形

void drawRect(int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (i == 0 || i == rows-1 || j == 0 || j == cols-1)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}
// 調用
int r, c; scanf("%d%d", &r, &c); drawRect(r, c);

3. 有參有返:三數求和

int sum3(int a, int b, int c) { return a + b + c; }
// 調用
int x, y, z, s; scanf("%d%d%d", &x, &y, &z); s = sum3(x, y, z); printf("%d\n", s);

4. 有參無返:兩數求和並打印

void printSum(int a, int b) { printf("%d\n", a + b); }

三、遞歸函數:函數直接/間接調用自身

三要素:

  1. 遞歸出口:基準情況,直接返回,不再遞歸。
  2. 遞歸規律:大問題分解為小問題,調用自身。
  3. 調用棧:每層調用佔用棧幀,深度受限(通常 ~10^4~10^5)。

經典 1:階乘

int factorial(int n) {
    if (n <= 1) return 1;           // 出口
    return n * factorial(n - 1);    // 規律
}
// 測試
printf("%d\n", factorial(6));  // 720

經典 2:斐波那契數列

int fib(int n) {
    if (n <= 2) return 1;           // 出口:F(1)=F(2)=1
    return fib(n-1) + fib(n-2);     // 規律
}
// 打印前 30 項,每行 5 個
for (int i = 1; i <= 30; i++) {
    if ((i-1) % 5 == 0) printf("\n");
    printf("%10d", fib(i));
}
printf("\n");

輸出:


         1         1         2         3         5
         8        13        21        34        55
        89       144       233       377       610
       987      1597      2584      4181      6765
      10946     17711     28657     46368     75025
     121393    196418    317811    514229    832040

遞歸 vs 迭代對比

維度遞歸迭代
代碼簡潔度高(數學定義直譯)中
時間複雜度(斐波那契)O(2^n) 指數級O(n) 線性
空間複雜度O(n) 棧深度O(1)
適用場景樹/圖遍歷、分治、回溯、棧天然匹配簡單線性計算、性能敏感

斐波那契遞歸存在大量重複計算,實際工程**必須用迭代或備忘錄(DP)優化**。

四、函數聲明、定義、調用規範

  1. 聲明:告知編譯器函數簽名,通常放在頭文件(.h)或文件頂部。
  2. 定義:實現函數體,放在源文件(.c)。
  3. 調用:實參壓棧/傳寄存器,跳轉執行,返回值接收。
  4. 作用域:默認 extern,全程序可見;static 限制本文件可見。

五、參數傳遞機制深度

  • 值傳遞:實參拷貝一份給形參,**函數內修改不影響外部**(結構體大拷貝開銷大)。
  • 地址傳遞:傳遞指針,**通過解引用可修改外部變量**,大結構體傳指針避免拷貝。
  • 模擬引用:C 無原生引用,用指針實現引用語義(void swap(int *a, int *b))。

六、最佳實踐清單

  1. 單一職責:一個函數只做一件事,控制在 50 行以內。
  2. 命名語義化:動詞開頭(calculate/parse/validate)。
  3. 參數驗證:指針非空檢查、範圍校驗,失敗返回錯誤碼或設置 errno。
  4. const 正確性:只讀參數加 const(void print(const char *str))。
  5. 避免全局變量依賴,優先通過參數傳遞上下文。
  6. 遞歸必設深度限制或改寫為迭代。
  7. 頭文件包含保護(#pragma once 或 #ifndef)。

掌握函數分類、遞歸設計模式、參數傳遞語義與工程規範,即可編寫高內聚、低耦合、可測試、可維護的 C 模塊化代碼。

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