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

純 C 語言遞歸實現二進制轉十進制:字符流處理源碼解析

     編輯:關於C

本文展示一個純 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;
}

關鍵點修正說明

  1. 字符讀取位置:原文 scanf("%c",c) 錯誤,應用 getchar() 或 scanf(" %c", &c) 讀取單字符(注意跳過空白)。
  2. 指針解引用:*m=*m+1 → (*m)++;*sum=... 正確。
  3. 遞歸終止條件:遇到第二個 # 停止遞歸深入,開始回溯計算。
  4. 權值計算:第 n 位(從 0 計)對應權值 2^(m-n-1),代碼中 pow(2, *m - n) 邏輯正確(*m 為總位數)。

運行示例

請輸入二進制數(以 # 開始和結束,如 #1010#):#1010#
十進制結果:10

遞歸 vs 迭代對比

維度遞歸迭代
代碼長度短稍長
空間複雜度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;
}

總結

遞歸處理字符流轉換展示了「先深入到末尾,回溯時計算」的經典模式。但受限於棧深度與效率,**實際項目中二進制轉十進制請使用位運算迭代版本**。本例適合作為遞歸思想、指針參數、字符流處理的教學示例。

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