免費開始練習
普考申論題 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
📝 此題為申論題,共 4 小題

小題 (一)

請說明下列遞迴函式 findnum 目的為何?(5 分)

思路引導 VIP

觀察函式的初始呼叫參數(i=0, num=-1)與內部的條件判斷(num < price[i]),可以發現程式會逐一走訪陣列,並將較大的值持續覆蓋至 num 變數。透過分析這個比對與遞迴傳遞的過程,即可推論出其目的為尋找最大值。

🤖
AI 詳解
AI 專屬家教

此遞迴函式 findnum 的目的為「找出並回傳陣列 price 中的最大值(即最高價格)」。 程式運作機制如下:

  1. main 函式中,初始呼叫 findnum(0, -1),將基準值設為 -1(因輸入的價錢皆為正整數)。

小題 (二)

請將 findnum()函式改寫成非遞迴的函式。(10 分)

思路引導 VIP

觀察原本的 findnum() 遞迴函式,其核心邏輯是逐步比較陣列元素以找出最大值。改寫為非遞迴版本時,只需使用 forwhile 迴圈來取代遞迴呼叫 findnum(i+1, num),依序走訪陣列更新最大值即可。

🤖
AI 詳解
AI 專屬家教

【破題】本題要求將尋找陣列最大值的遞迴函式改寫為非遞迴(迭代)版本,解題關鍵在於使用迴圈(如 forwhile)來取代遞迴呼叫,以依序走訪陣列並記錄最大值。 【程式碼實作】

小題 (三)

請說明下列非遞迴程式目的為何?(5 分)

思路引導 VIP

觀察第一個 while 迴圈中的 m % 2m / 2,可立刻辨識這是十進位轉二進位的短除法。接著分析變數 ncount 的作用,確認其為反轉並印出正確的二進位序列。

🤖
AI 詳解
AI 專屬家教

該非遞迴程式 convert() 的目的為:「將輸入的十進位正整數轉換為二進位數值並印出」。 程式邏輯解析:

  1. 位元擷取與暫存:第一個 while 迴圈透過 m % 2(取餘數)與 m / 2(商數),逐一求出該整數二進位的各個位元(由低位到高位)。透過 n = n*10 + m%2 將位元暫存在變數 n 中,同時以 count 紀錄總位數,避免因最低位為 0 而導致後續還原時遺失。

小題 (四)

請將 convert()函式改寫成以遞迴運算的函式,且函式內不可新增變數。(10 分)

思路引導 VIP

本題考查「十進位轉二進位」的遞迴寫法,且要求「不可新增變數」。思考核心在於利用遞迴的「堆疊(Stack)」特性來先進入遞迴再反向印出餘數,藉此取代原先使用迴圈與區域變數來反轉數字的邏輯,同時需注意輸入為 0 時的邊界條件。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】利用遞迴呼叫的堆疊(Call Stack)特性來反轉輸出順序,藉由先遞迴後輸出的機制省去區域變數。 【解答】 程式碼實作:

升級 VIP 解鎖