普通考試
115年
[電信工程] 計算機概要
第 25 題
給定下列以 C 語言實作的函數 A,下列敘述何者錯誤?\nint A(int m, int n)
{\nif (m < n)\nreturn 0;\nelse\nreturn A(m-n, n)+1;
}
{\nif (m < n)\nreturn 0;\nelse\nreturn A(m-n, n)+1;
}
- A A(4, 2)=A(2, 2)+1
- B A(2, 8)=A(2, 7)
- C A(7, 2)=A(3, 2)+2
- D A(2, 8)=A(2, 4)+1
思路引導 VIP
請想像你有一個裝有 $m$ 升水的容器,每次拿一個容量為 $n$ 升的量杯去取水,直到剩下的水不足一滿杯為止。在這個過程中,函數所回傳的數值代表你「成功取水」的次數。現在請思考:如果一開始容器裡的水就已經比量杯還要少($m < n$),你還能取水嗎?如果此時再隨意改變量杯的大小(只要依然比現有的水多),取水的次數會發生變化嗎?
🤖
AI 詳解
AI 專屬家教
同學好,恭喜你精準地掌握了這題的核心觀念!在工程設計中,我們常將複雜問題拆解為重複的子結構,而這段 C 語言程式碼正是利用**遞迴(Recursion)**的概念,實作出整數除法的邏輯。當我們呼叫 $A(m, n)$,若 $m \ge n$,程式會不斷執行減法並累積計數,這本質上是在計算 $m$ 當中包含幾個 $n$。
遞迴邏輯與邊界判定
這個函數的正確性建立在「終止條件」與「遞迴項」的對應。當我們檢驗選項 (D) 時,左側 $A(2, 8)$ 滿足條件 $m < n$(即 $2 < 8$),因此根據定義直接回傳 $0$。而右側的 $A(2, 4) + 1$,其 $A(2, 4)$ 同樣因 $2 < 4$ 回傳 $0$,但最後會再加上 $1$,導致結果為 $1$。兩者顯然不相等,這正是本題的錯誤所在。其他的選項如 (A) 僅是展開一次遞迴,(B) 兩者皆小於除數而回傳 $0$,(C) 則是連續展開兩次遞迴,邏輯皆完全自洽。
▼ 還有更多解析內容