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;
}
recui(a,5) → 滿足 k>1 → 呼叫 recui(a,4)recui(a,4) → 呼叫 recui(a,3)recui(a,3) → 呼叫 recui(a,2)recui(a,2) → 呼叫 recui(a,1)recui(a,1) → k>1 為假,**直接返回** (基準情況)a[0]、a[1] → {2,1,3,4,5}a[0]、a[2] → {3,1,2,4,5}a[0]、a[3] → {4,1,2,3,5}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
left >= right 或 k <= 1,停止遞迴。left+1, right-1 或 k-1,向基準邁進。