普考申論題
112年
[資訊處理] 程式設計概要
第 一 題
📖 題組:
撰寫遞迴函式是重要程式設計技巧之一。 (一)請說明下列遞迴函式 findnum 目的為何?(5 分) (二)請將 findnum()函式改寫成非遞迴的函式。(10 分) (三)請說明下列非遞迴程式目的為何?(5 分) (四)請將 convert()函式改寫成以遞迴運算的函式,且函式內不可新增變數。(10 分) int items, price[100];//全域變數 int findnum (int i, int num) { if (i < items) { if (num < price[i]) num = price[i]; num = findnum (i+1, num); } return num; } int main () { int i, num; // 讀入數量及所有正整數價錢 scanf("%d", &items); for (i=0; i
撰寫遞迴函式是重要程式設計技巧之一。 (一)請說明下列遞迴函式 findnum 目的為何?(5 分) (二)請將 findnum()函式改寫成非遞迴的函式。(10 分) (三)請說明下列非遞迴程式目的為何?(5 分) (四)請將 convert()函式改寫成以遞迴運算的函式,且函式內不可新增變數。(10 分) int items, price[100];//全域變數 int findnum (int i, int num) { if (i < items) { if (num < price[i]) num = price[i]; num = findnum (i+1, num); } return num; } int main () { int i, num; // 讀入數量及所有正整數價錢 scanf("%d", &items); for (i=0; i
📝 此題為申論題,共 4 小題
小題 (一)
請說明下列遞迴函式 findnum 目的為何?(5 分)
思路引導 VIP
觀察函式的初始呼叫參數(i=0, num=-1)與內部的條件判斷(num < price[i]),可以發現程式會逐一走訪陣列,並將較大的值持續覆蓋至 num 變數。透過分析這個比對與遞迴傳遞的過程,即可推論出其目的為尋找最大值。
小題 (二)
請將 findnum()函式改寫成非遞迴的函式。(10 分)
思路引導 VIP
觀察原本的 findnum() 遞迴函式,其核心邏輯是逐步比較陣列元素以找出最大值。改寫為非遞迴版本時,只需使用 for 或 while 迴圈來取代遞迴呼叫 findnum(i+1, num),依序走訪陣列更新最大值即可。
小題 (三)
請說明下列非遞迴程式目的為何?(5 分)
思路引導 VIP
觀察第一個 while 迴圈中的 m % 2 與 m / 2,可立刻辨識這是十進位轉二進位的短除法。接著分析變數 n 與 count 的作用,確認其為反轉並印出正確的二進位序列。
小題 (四)
請將 convert()函式改寫成以遞迴運算的函式,且函式內不可新增變數。(10 分)
思路引導 VIP
本題考查「十進位轉二進位」的遞迴寫法,且要求「不可新增變數」。思考核心在於利用遞迴的「堆疊(Stack)」特性來先進入遞迴再反向印出餘數,藉此取代原先使用迴圈與區域變數來反轉數字的邏輯,同時需注意輸入為 0 時的邊界條件。