普考申論題
110年
[資訊處理] 程式設計概要
第 一 題
📖 題組:
二、程式語言 C 的程式碼是由許多函式(Function)組成。 #include
int memo[20][20], number=0;
int B(int n, int k){
if((n >= 0)&&(k >= 0)&&(n >= k))
if((k == 0)||(k == n)){
memo[n][k] = 1;
return 1;
}
else if(memo[n][k] > 0)
return memo[n][k];
else{
memo[n][k] = B(n-1, k-1)+ B(n-1, k);
number+=2;
return memo[n][k];
}
else return 0;
}
void f(int N, int M){
int sum=0;
for(int i=1; i<=N; i++){
if(i>=10)break;
if(i%3==0)continue;
sum = sum + B(i, 2);
}
printf("%d %d ", sum, number);
}
int g(int N, int M){
if((N<=0)||(M<0))return 1;
else return(M + N + g(M-2, N-3));
}
int main(){
f(20, 10);
printf("%d\n", g(20, 10));
return 0;
}
二、程式語言 C 的程式碼是由許多函式(Function)組成。 #include
📝 此題為申論題,共 3 小題
小題 (一)
請說明上述程式執行的結果。(15 分)
思路引導 VIP
這是一道程式追蹤題(Code Tracing)。需要分兩階段追蹤:1. 追蹤 f(20, 10),解構 for 迴圈中 break 和 continue 的作用,確認實際執行的 i 值。接著追蹤帶有動態規劃(Memoization)機制的遞迴函式 B(i, 2),並仔細計算全域變數 number 被加了多少次。2. 追蹤 g(20, 10) 的遞迴呼叫過程,直至滿足終止條件,將所有回傳值加總。最後依照 printf 格式寫出輸出字串。
小題 (二)
請說明上述程式中 break 與 continue 指令行的意義,並比較兩個指令之功能差異。(5 分)
思路引導 VIP
本題測驗基礎的控制流程指令。首先分別說明 break 和 continue 在該程式中的具體作用,然後抽象出兩者的根本功能差異。
小題 (三)
請說明 C 程式使用遞迴(Recursion)與迴圈(Loop),在時間、空間與程式可讀性之優缺點。(5 分)
思路引導 VIP
這是一道經典的觀念比較題。切入點應嚴格依照題目給定的三個維度進行對比:時間(執行速度/額外開銷)、空間(記憶體使用/堆疊溢位風險)、可讀性(程式邏輯表達/維護性)。