免費開始練習
地特三等申論題 111年 [資訊處理] 程式設計

第 一 題

📖 題組:
一、有關 C 程式設計,回答下列問題:
📝 此題為申論題,共 2 小題

小題 (一)

下列程式執行結果為何?(13 分) #include int func1(int a, int b){ printf("%3d %3d\n", a, b); if (b == 0) return a; else if (a % 2 && b % 2) return func1((a + b) / 2, (a - b) / 2); else if (a % 2 && !(b % 2)) return func1(a, b / 2); else if (!(a % 2) && b % 2) return func1(a / 2, b); else return 2 * func1(a / 2, b / 2); } int main(void) { int x = 19, y = 2; printf("%3d", func1(x, y)); }

思路引導 VIP

本題考驗 C 語言遞迴函式的追蹤能力以及算術運算與邏輯判斷的細節(特別是非零值即為真的特性)。解題時應將每次呼叫的 a 和 b 帶入,並依序寫下 printf 的格式化輸出(留意 %3d 佔用的空白數),同時特別注意當計算到負數取餘數「-1 % 2 = -1」時,在條件判斷中應視為真(True)。

🤖
AI 詳解
AI 專屬家教

【解題思路】依序追蹤遞迴函式每一次傳入的參數,判斷條件分支,並嚴格依照 printf 格式化字串的要求記錄輸出結果。 【詳解】 已知初始呼叫為 func1(19, 2)。在 C 語言中,條件判斷「非零即為真」,當運算到負數取餘數 -1 % 2 得到 -1 時,亦視為 True。

小題 (二)

下列程式執行結果為何?(10 分) #include #include bool func2(int A[], int x, int y){ if (x > y) return false; else{ int m = (x + y) / 2; printf("%3d %3d %3d\n", x, m, y); if (A[m] == m) return true; else if (A[m] > m) return func2(A, x, m - 1); else return func2(A, m + 1, y); } } int main(void) { int a[] = { 35, 60, 45, 7, 10, 22, 2, 50, 14, 3, 66}; printf("%3d", func2(a, 1, 10)); }

思路引導 VIP

這是一題典型的遞迴追蹤與二元搜尋(Binary Search)變體題。解題時應先寫出陣列各索引對應的值,然後依序記錄每次遞迴呼叫時 x, y, m 參數的變化與輸出;最後要特別注意 C 語言中 bool 型態回傳 false 時,以 %3d 格式列印會輸出 0。

🤖
AI 詳解
AI 專屬家教

【解題思路】利用變數追蹤表(Trace Table)逐步記錄遞迴函式中陣列索引 x, y, m 的變化,以及每次 printf 輸出的結果。 【詳解】 已知:陣列 a 的內容與對應的索引值(Index)如下:

📝 同份考卷的其他題目

查看 111年[資訊處理] 程式設計 全題

升級 VIP 解鎖