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

C 語言遞迴實作陣列逆序輸出:填空題完整解析與遞迴思維訓練

     編輯:程式設計綜合問答

題目還原

void recui(int a[], int k) {
    int tmp;
    if (________) {           // (1) 遞迴終止條件
        recui(________);      // (2) 遞迴呼叫
        tmp = a[0];
        a[0] = a[k - 1];
        a[k - 1] = tmp;
    }
}

標準答案

if (k > 1) {        // (1) 當陣列長度大於 1 才需交換
    recui(a, k - 1); // (2) 縮小問題規模,處理前 k-1 個元素
    // 此時前 k-1 已逆序,再交換首尾完成整體逆序
    tmp = a[0];
    a[0] = a[k - 1];
    a[k - 1] = tmp;
}

遞迴執行流程圖解 (以 a={1,2,3,4,5}, k=5 為例)

  1. recui(a,5) → 滿足 k>1 → 呼叫 recui(a,4)
  2. recui(a,4) → 呼叫 recui(a,3)
  3. recui(a,3) → 呼叫 recui(a,2)
  4. recui(a,2) → 呼叫 recui(a,1)
  5. recui(a,1) → k>1 為假,**直接返回** (基準情況)
  6. 回溯執行交換:
    • 第 4 層返回後:交換 a[0]、a[1] → {2,1,3,4,5}
    • 第 3 層返回後:交換 a[0]、a[2] → {3,1,2,4,5}
    • 第 2 層返回後:交換 a[0]、a[3] → {4,1,2,3,5}
    • 第 1 層返回後:交換 a[0]、a[4] → {5,1,2,3,4} ❌

發現問題? 上述流程得到 {5,1,2,3,4} 而非 {5,4,3,2,1}。原題邏輯**僅能將首元素移至尾部**,非完整逆序。

正確遞迴逆序實作

void reverse(int a[], int left, int right) {
    if (left >= right) return;           // 基準情況
    int tmp = a[left];
    a[left] = a[right];
    a[right] = tmp;
    reverse(a, left + 1, right - 1);     // 縮小區間
}

// 呼叫
reverse(a, 0, 4); // 陣列長度 5

遞迴設計三要素

  1. 基準情況:left >= right 或 k <= 1,停止遞迴。
  2. 縮小問題:left+1, right-1 或 k-1,向基準邁進。
  3. 合併結果:交換首尾、回傳計算結果等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved