免費開始練習
地特四等 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

▼ 還有更多解析內容

🏷️ 相關主題

程式語言語法與程式設計基礎
查看更多「[電子工程] 計算機概要」的主題分類考古題