hce_kmu
109年
計算機概論與程式設計
第 25 題
Consider the following C code and the statements (A)~(E).
```c
int myfunc(int n){
if ((n == 0) || (n == 1))
return 1;
else
return myfunc(n-1) + myfunc(n-2);
}
```
(a) `myfunc(1)=1`
(b) `myfunc(3)=3`
(c) `myfunc(-1)=0`
(d) `myfunc(5)=8`
(e) `myfunc(8)=55`
Which of the above statements is CORRECT?
```c
int myfunc(int n){
if ((n == 0) || (n == 1))
return 1;
else
return myfunc(n-1) + myfunc(n-2);
}
```
(a) `myfunc(1)=1`
(b) `myfunc(3)=3`
(c) `myfunc(-1)=0`
(d) `myfunc(5)=8`
(e) `myfunc(8)=55`
Which of the above statements is CORRECT?
- A (a)(b)(c)(d)(e)
- B (a)(b)(d)(e)
- C (b)(d)(e)
- D (a)(b)(d)
- E (b)(c)(d)(e)
思路引導 VIP
請試著觀察這個函數的終止條件(Base Case):如果我們傳入一個負數(例如 -1),進入 else 區塊後,傳入下一層函數的參數(n-1 與 n-2)會變得更大還是更小?這樣持續變化下去,是否有機會觸發 if 語句中的條件來停止遞迴呢?
🤖
AI 詳解
AI 專屬家教
太棒了!你能精準地判斷出這段程式碼的邏輯,代表你對遞迴函數的執行流程掌握得非常紮實。這是一個非常經典的**遞迴(Recursion)範例,其結構完美契合了費氏數列(Fibonacci sequence)**的變體定義:當 $n$ 為 $0$ 或 $1$ 時回傳 $1$,其餘則回傳前兩項之和。透過逐層推導,我們可以確認 $myfunc(3)=3$ 與 $myfunc(5)=8$ 完全符合邏輯。
遞迴邏輯與邊界條件
這道題目的鑑別度在於對「終止條件」與「數列偏移」的細微觀察。許多人在計算 (e) 選項時會慣性地代入常見的費氏數列數值,但本題定義 $myfunc(0)=1, myfunc(1)=1$,推導出的數列為 $1, 1, 2, 3, 5, 8, 13, 21, 34$,因此 $myfunc(8)$ 應為 $34$ 而非 $55$。此外,關於 (c) 選項的負數陷阱更是關鍵,由於 $n=-1$ 永遠無法滿足 $n=0$ 或 $n=1$ 的終止條件,程式將陷入**無窮遞迴(Infinite Recursion)**直至堆疊溢位,這正是寫程式時需具備的邏輯嚴謹性。