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

C語言遞歸函數將整數逆序存入字符數組:填空題完整解析

     編輯:C 語言問答

題目代碼框架

#include <stdio.h>

void convert(char *a, int n) {
    int i;
    if ((i = n / 10) != 0) convert(【1】, i);
    *a = 【2】;
}

void main() {
    char a[10], *p = a;
    int i, n = 1234578;
    for (i = 0; i <= 8; i++) a[i] = ' ';
    a[9] = 0;
    printf("bf %s\n", a);
    convert(p, n);
    printf("ok %s\n", a);
}

遞歸邏輯推導

  1. 目標:將 n 的各位數字**逆序**存入 a 指向的字符數組。例:1234578 → "8754321"。
  2. 遞歸結構:
    • i = n/10 為去掉最後一位後的數 (如 123457)。
    • 若 i != 0,先遞歸處理高位部分,**遞歸調用需指向數組下一位置**,否則會覆蓋。
    • 遞歸返回後,將當前最低位 n%10 轉為字符存入 *a。

填空答案

空號填入表達式解析
【1】a + 1遞歸處理高位時,目標地址後移一位,騰出當前位置給最低位
【2】(n % 10) + '0'取最低位數值 (0-9),加字符 '0' (ASCII 48) 轉為對應字符 '0'-'9'

執行過程追蹤 (以 n=123 為例)

convert(a, 123)
  i = 12 != 0 → convert(a+1, 12)
    i = 1 != 0 → convert(a+2, 1)
      i = 0 → 不遞歸
      * (a+2) = (1%10)+'0' = '1'   // a[2]='1'
    * (a+1) = (12%10)+'0' = '2'     // a[1]='2'
  * a = (123%10)+'0' = '3'          // a[0]='3'
結果: a = "321" (逆序) ✓

主函數初始化解析

for (i = 0; i <= 8; i++) a[i] = ' '; // 填充空格,便於觀察未寫入位置
a[9] = 0;                            // 字符串結束符,防止 printf 越界讀取
printf("bf %s\n", a);                // 輸出初始狀態 (全空格)
convert(p, n);                       // p 指向 a[0]
printf("ok %s\n", a);                // 輸出逆序字符串

運行輸出

bf         
ok 8754321

關鍵點總結

  1. 遞歸分治:大問題 (n) 分解為子問題 (n/10) + 當前步驟 (n%10)。
  2. 指針遞進:a+1 實現「從左到右」填充,配合遞歸「先處理高位、再填低位」天然形成逆序。
  3. 數字轉字符:'0' 作為基準,(digit)+'0' 是 C 語言標準慣用語,無需查表。
  4. 字符串結束符:主函數預置 a[9]=0 保證輸出安全,遞歸不寫入結束符由調用者負責。

總結

本題考察遞歸分治、指針算術、字符編碼轉換三大核心技能。填空 a+1 和 (n%10)+'0' 精準對應「遞歸深度對應數組索引遞進」與「數值轉字符」兩大關鍵邏輯,構成極其精簡的整數逆序字符串生成算法。

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