函數是 C 語言模塊化編程的基本單元。本文系統講解四類函數結構、參數與返回值機制、遞歸函數經典實戰、聲明定義調用規範,助你掌握函數設計精髓。
| 類型 | 參數 | 返回值 | 聲明示例 | 適用場景 |
|---|---|---|---|---|
| 無參無返 | 無 | void | void sayHi(); | 固定流程、初始化、打印菜單 |
| 有參無返 | 有 | void | void drawRect(int w, int h); | 輸出型操作、狀態設置、回調處理 |
| 無參有返 | 無 | 非 void | int getRandom(); | 獲取狀態、工廠函數、輸入讀取 |
| 有參有返 | 有 | 非 void | int add(int a, int b); | 計算、轉換、查詢、核心邏輯 |
void sayHi() { printf("你好!\n"); }
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);
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);
void printSum(int a, int b) { printf("%d\n", a + b); }
三要素:
int factorial(int n) {
if (n <= 1) return 1; // 出口
return n * factorial(n - 1); // 規律
}
// 測試
printf("%d\n", factorial(6)); // 720
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
| 維度 | 遞歸 | 迭代 |
|---|---|---|
| 代碼簡潔度 | 高(數學定義直譯) | 中 |
| 時間複雜度(斐波那契) | O(2^n) 指數級 | O(n) 線性 |
| 空間複雜度 | O(n) 棧深度 | O(1) |
| 適用場景 | 樹/圖遍歷、分治、回溯、棧天然匹配 | 簡單線性計算、性能敏感 |
斐波那契遞歸存在大量重複計算,實際工程**必須用迭代或備忘錄(DP)優化**。
.h)或文件頂部。.c)。extern,全程序可見;static 限制本文件可見。void swap(int *a, int *b))。calculate/parse/validate)。errno。const(void print(const char *str))。#pragma once 或 #ifndef)。掌握函數分類、遞歸設計模式、參數傳遞語義與工程規範,即可編寫高內聚、低耦合、可測試、可維護的 C 模塊化代碼。