首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言遞迴實作字串轉整數:不使用迴圈的數值解析

     編輯:程式設計綜合問答

題目要求

  • C 語言
  • 遞迴演算法
  • 將正整數字串 (如 "1234") 轉為對應整數值 (1234)
  • 不得使用迴圈

核心思路:左到右累積 (尾遞迴)

處理字串 "1234":

初始累積值 = 0
讀 '1' → 0*10 + 1 = 1
讀 '2' → 1*10 + 2 = 12
讀 '3' → 12*10 + 3 = 123
讀 '4' → 123*10 + 4 = 1234
字串結束 → 返回 1234

完整程式碼 (修正原回答參數順序問題)

#include 

/**
 * 遞迴字串轉整數
 * @param str  當前處理位置指標
 * @param acc  累積值 (初始呼叫傳 0)
 * @return     解析後的整數值
 */
int strToIntRecursive(const char *str, int acc) {
    // 基底情況:字串結束 (\0)
    if (*str == '\0') {
        return acc;
    }

    // 當前字元轉數字 (假設輸入合法數字字元)
    int digit = *str - '0';

    // 尾遞迴:累積值 * 10 + 當前位,指標前移
    return strToIntRecursive(str + 1, acc * 10 + digit);
}

int main() {
    char str[] = "1234";
    int result = strToIntRecursive(str, 0);
    printf("字串 \"%s\" 轉整數 = %d\n", str, result);
    return 0;
}

執行流程追蹤

遞迴層級str 指向acc (累積值)digit新 acc動作
1'1'011遞迴(str+1, 1)
2'2'1212遞迴(str+1, 12)
3'3'123123遞迴(str+1, 123)
4'4'12341234遞迴(str+1, 1234)
5'\0'1234--返回 1234

關鍵點說明

  • 尾遞迴:遞迴呼叫是最後一步動作,編譯器可優化為迴圈 (O(1) 堆疊空間)
  • 累積器參數:將「狀態」 (已解析數值) 由參數傳遞,符合函數式風格
  • 指標算術:`str + 1` 移動到下一字元,`*str - '0'` 字元轉數值
  • 無迴圈:完全符合題目限制

錯誤處理延伸 (生產級程式碼)

int strToIntSafe(const char *str, int acc, int *error) {
    if (*str == '\0') return acc;
    if (*str < '0' || *str > '9') { *error = 1; return 0; } // 非法字元
    // 檢查溢位 (INT_MAX = 2147483647)
    if (acc > (INT_MAX - (*str - '0')) / 10) { *error = 2; return 0; }
    return strToIntSafe(str + 1, acc * 10 + (*str - '0'), error);
}

總結

遞迴實作字串轉整數的核心是 **「左到右掃描、累積值 × 10 + 當前位」**。使用尾遞迴 + 累積器參數可獲得清晰、高效且符合「無迴圈」限制的解法。實際專案中建議加入邊界檢查 (空指標、非法字元、溢位)。

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