陣列最大值 = max(首元素, 剩餘陣列最大值)。基礎情況:陣列長度為 1 時直接回傳該元素。
#include <stdio.h>
int GetMax(int arr[], int n) {
if (n == 1) return arr[0]; // 基礎情況
int max_rest = GetMax(arr + 1, n - 1); // 遞歸處理剩餘
return (arr[0] > max_rest) ? arr[0] : max_rest;
}
int main() {
int arr[5];
printf("請輸入 5 個整數: ");
for (int i = 0; i < 5; i++) scanf("%d", &arr[i]);
printf("最大值: %d\n", GetMax(arr, 5));
return 0;
}
int Getmax(int arr[n]):C 不支援 VLA 作為參數型別,應為 int arr[] 或 int *arr。for(int i=0;i:逗號運算子誤用,且迴圈邏輯與遞歸衝突。 Getmax(arr[]+1,n-1):語法錯誤,正確寫法 arr+1 或 &arr[1]。max=Getmax(arr[5]):傳遞單一元素而非陣列指標。| 特性 | 遞歸 | 迴圈 |
|---|---|---|
| 可讀性 | 直觀符合數學定義 | 需手動維護狀態 |
| 空間複雜度 | O(n) 堆疊幀 | O(1) |
| 效能 | 函數呼叫開銷 | 極快 |
| 適用場景 | 教學、分治、樹圖遍歷 | 簡單線性掃描 |
若編譯器支援尾呼叫優化(GCC -O2),可改寫為尾遞歸形式避免堆疊增長:
int GetMaxTail(int arr[], int n, int current_max) {
if (n == 0) return current_max;
int new_max = (arr[0] > current_max) ? arr[0] : current_max;
return GetMaxTail(arr+1, n-1, new_max);
}
// 呼叫: GetMaxTail(arr, 5, arr[0])
遞歸是程式設計的核心思維工具,掌握基礎情況、遞歸步驟與縮減問題規模三要素,即可解決許多複雜問題。