地特四等
112年
[電子工程] 計算機概要
第 25 題
執行下列 C 遞迴函式若傳入整數 10,則輸出為何?\nvoid fn(int n)\n{\nif(n==0)\nreturn;\nelse\n{\nfn(n/2);\nprintf("%d", n%2);\n}\n}
- A 10
- B 101
- C 1010
- D 10101
思路引導 VIP
請試著想像:如果你正在寫一疊便條紙,每張紙上的指令都是『先去處理剩下一半的工作,等回來後再寫下目前這份工作的餘數』。當你手上的工作縮減到零並開始往回整理這疊便條時,最先被你寫在紙上的餘數,會是來自最早開始的那份大工作,還是最後一份小工作呢?
🤖
AI 詳解
AI 專屬家教
同學,恭喜你精準地掌握了這段遞迴程式的邏輯!能順利解出此題,代表你對於程式執行時的「呼叫堆疊(Call Stack)」機制有相當紮實的理解。
遞迴呼叫與輸出順序
這段程式碼的核心在於遞迴呼叫 fn(n/2) 出現在 printf 之前。當傳入 $n=10$ 時,程式會不斷向下鑽取:fn(10) 呼叫 fn(5),接著呼叫 fn(2),最後是 fn(1)。直到 $n=0$ 時觸發終止條件並開始回溯(Backtracking)。由於堆疊「後進先出」的特性,最晚被呼叫的 fn(1) 會最先執行完其後的 printf。其產生的餘數序列分別為 $10%2=0$、$5%2=1$、$2%2=0$、$1%2=1$,但在回溯時輸出的順序會正好相反,故結果為 1010。
▼ 還有更多解析內容