普考申論題
112年
[資訊處理] 程式設計概要
第 三 題
📖 題組:
二、根據以下C程式碼,回答下列問題: 1 #include
2 int f(int a, int b){
3 if (b==1) return a;
4 else {
5 int value = a + f(a, b-1);
6 return value;
7 }
8 }
9 int main() {
10 printf("%d\n", f(5, 3));
11 printf("%d\n", f(0, 0));
12 }
二、根據以下C程式碼,回答下列問題: 1 #include
📝 此題為申論題,共 4 小題
小題 (三)
請說明第11行的輸出,以及其運作邏輯。(7分)
思路引導 VIP
思考當傳入的初始條件不符合中止條件的演進方向時會發生什麼事。此題傳入 b=0,遞迴呼叫時 b 一直減 1 (-1, -2, -3...),永遠無法命中 b==1,這會造成記憶體耗盡的現象。
小題 (一)
請問那一行是此遞迴程式的中止條件?(5分)
思路引導 VIP
觀察遞迴函式中,當某個條件成立時不再進行函式的自我呼叫,而直接回傳數值的判斷式即為中止條件 (Base case)。直接定位帶有 return 且不含遞迴呼叫的 if 判斷式。
小題 (二)
請說明第10行的輸出,以及其運作邏輯。(6分)
思路引導 VIP
將引數 a=5, b=3 實際代入程式中演練。每次遞迴都會將 a 加上 f(a, b-1) 的結果。展開算式後,發現這是實作整數乘法的邏輯。
小題 (四)
請說明函式f的主要功能,包含輸入參數與輸出結果的關係。(7分)
思路引導 VIP
綜合前兩題的觀察。正常情況下(b>=1)函式在做乘法。但因為缺乏防呆機制,所以它並不是一個通用的乘法函式。應該明確指出其輸入限制與輸出的數學對應關係。