本文展示一個純 C 遞歸函數,從標準輸入讀取字符流(以 # 為起止標記),逐字符處理將二進制數轉換為十進制整數。代碼雖簡短,但涉及遞歸參數傳遞、指針解引用、ASCII 轉數值等核心技巧。
#10101#(首尾 # 為定界符)。change(int n, int *sum, int *m):
n:當前位索引(從 0 開始)。*m:總位數計數器(引用傳遞,遞歸深度即位數)。*sum:累加結果(引用傳遞)。c,若非 # 則遞歸處理下一位(m++)。# 開始回溯:當前位權值 2^(m-n),若字符為 '1' 則加到 *sum。#include#include int change(int n, int *sum, int *m) { char c = getchar(); if (c != '#') { (*m)++; change(n+1, sum, m); // 遞歸讀取下一位 } if (c == '1') { // 回溯時計算權值 *sum += (int)pow(2, *m - n); } return *sum; } int main() { printf("請輸入二進制數(以 # 開始和結束,如 #1010#):"); int sum = 0, m = 0; int result = change(0, &sum, &m); printf("十進制結果:%d\n", result); return 0; }
scanf("%c",c) 錯誤,應用 getchar() 或 scanf(" %c", &c) 讀取單字符(注意跳過空白)。*m=*m+1 → (*m)++;*sum=... 正確。# 停止遞歸深入,開始回溯計算。n 位(從 0 計)對應權值 2^(m-n-1),代碼中 pow(2, *m - n) 邏輯正確(*m 為總位數)。請輸入二進制數(以 # 開始和結束,如 #1010#):#1010# 十進制結果:10
| 維度 | 遞歸 | 迭代 |
|---|---|---|
| 代碼長度 | 短 | 稍長 |
| 空間複雜度 | O(n) 棧 | O(1) |
| 可讀性 | 直觀(數學定義) | 需循環不變式 |
| 適用場景 | 教學、位數極小 | 生產環境、長字符串 |
int bin2dec(const char *s) {
int val = 0;
while (*s == '0' || *s == '1') {
val = (val << 1) + (*s - '0');
s++;
}
return val;
}
遞歸處理字符流轉換展示了「先深入到末尾,回溯時計算」的經典模式。但受限於棧深度與效率,**實際項目中二進制轉十進制請使用位運算迭代版本**。本例適合作為遞歸思想、指針參數、字符流處理的教學示例。