# APCS 觀念題 - 遞迴 ###### tags: `APCS` ## 第 1 題 給定下方函式 `f()`,已知 `f(14)`、`f(10)`、`f(6)` 分別回傳 25、18、10,函式中的 (?) 應為下列何者? ```c int f(int n) { if (n < 2) { return n; } else { return (n + f(___(?)___)); } } ``` (A) `(n + 1) / 2` (B) `n / 2` \(C\) `(n - 1) / 2` (D) `(n / 2) + 1` <!-- B --> ## 第 2 題 函數 `f()` 定義如下,如果呼叫 `f(1000)`,指令 `sum = sum + i` 被執行的次數最接近下列何者? ```c int f(int n) { int sum = 0; if (n < 2) { return 0; } for (int i = 1; i <= n; i = i + 1) { sum = sum + i; } sum = sum + f(2 * n / 3); return sum; } ``` (A) 1000 (B) 3000 \(C\) 5000 (D) 10000 <!-- B --> ## 第 3 題 請問以 `a(13, 15)` 呼叫下方 `a()` 函式,函式執行完後其回傳值為何? ```c int a(int n, int m) { if (n < 10) { if (m < 10) { return n + m; } else { return a(n, m - 2) + m; } } else { return a(n - 1, m) + n; } } ``` (A) 90 (B) 103 \(C\) 93 (D) 60 <!-- B --> ## 第 4 題 給定下方 `g()` 函式,`g(13)` 回傳值為何? ```c int g(int a) { if (a > 1) { return g(a - 2) + 3; } return a; } ``` (A) 16 (B) 18 \(C\) 19 (D) 22 <!-- C --> ## 第 5 題 給定下方函式 `f1()` 及 `f2()`。`f1(1)` 運算過程中,以下敘述何者為錯? ```c void f1(int m) { if (m > 3) { printf("%d\n", m); return; } else { printf("%d\n", m); f2(m + 2); printf("%d\n", m); } } void f2(int n) { if (n > 3) { printf("%d\n", n); return; } else { printf("%d\n", n); f1(n - 1); printf("%d\n", n); } } ``` (A) 印出的數字最大的是 4 (B) `f1` 一共被呼叫二次 \(C\) `f2` 一共被呼叫三次 (D) 數字 2 被印出兩次 <!-- C --> ## 第 6 題 下方程式輸出為何? ```c void foo(int i) { if (i <= 5) { printf("foo: %d\n", i); } else { bar(i - 10); } } void bar(int i) { if (i <= 10) { printf("bar: %d\n", i); } else { foo(i - 5); } } void main() { foo(15106); bar(3091); foo(6693); } ``` (A) ``` bar: 6 bar: 1 bar: 8 ``` (B) ``` bar: 6 foo: 1 bar: 3 ``` \(C\) ``` bar: 1 foo: 1 bar: 8 ``` (D) ``` bar: 6 foo: 1 foo: 3 ``` <!-- A --> ## 第 7 題 給定下方函式 `f()`,當執行 `f(10)` 時,最終回傳結果為何? ```c int f(int i) { if (i > 0) if (((i / 2) % 2) == 0) return f(i - 2) * i; else return f(i - 2) * (-i); else return 1; } ``` (A) 1 (B) 3840 \(C\) -3840 (D)執行時導致無窮迴圈,不會停止執行 <!-- C --> ## 第 8 題 下方為一個計算 n 階層的函式,請問該如何修改才會得到正確的結果? ```c= int fun(int n) { int fac = 1; if (n >= 0) { fac = n * fun(n - 1); } return fac; } ``` (A) 第 2 行,改為 `int fac = n;` (B) 第 3 行,改為 `if (n > 0) {` \(C\) 第 4 行,改為 `fac = n * fun(n + 1);` (D) 第 4 行,改為 `fac = fac * fun(n - 1);` <!-- B --> ## 第 9 題 下方 `g(4)` 函式呼叫執行後,回傳值為何? ```c int f(int n) { if (n > 3) { return 1; } else if (n == 2) { return (3 + f(n + 1)); } else { return (1 + f(n + 1)); } } int g(int n) { int j = 0; for (int i = 1; i <= n - 1; i = i + 1) { j = j + f(i); } return j; } ``` (A) 6 (B) 11 \(C\) 13 (D) 14 <!-- C --> ## 第 10 題 下方 `Mystery()` 函式 `else` 部分運算式應為何,才能使得 `Mystery(9)` 的回傳值為 `34`? ```c int Mystery(int x) { if (x <= 1) { return x; } else { return ___(?)___; } } ``` (A) `x + Mystery(x - 1)` (B) `x * Mystery(x - 1)` \(C\) `Mystery(x - 2) + Mystery(x + 2)` (D) `Mystery(x - 2) + Mystery(x - 1)` <!-- D --> ## 第 11 題 給定下方 `G()`, `K()` 兩函式,執行 `G(3)` 後所回傳的值為何? ```c int K(int a[], int n) { if (n >= 0) return (K(a, n - 1) + a[n]); else return 0; } int G(int n) { int a[] = {5, 4, 3, 2, 1}; return K(a, n); } ``` (A) 5 (B) 12 \(C\) 14 (D) 15 <!-- C --> ## 第 12 題 下方函式以 `F(7)` 呼叫後回傳值為 12,則 `<condition>` 應為何? ```c int F(int a) { if (<condition>) return 1; else return F(a - 2) + F(a - 3); } ``` (A) a < 3 (B) a < 2 \(C\) a < 1 (D) a < 0 <!-- D --> ## 第 13 題 下方主程式執行完三次 `G()` 的呼叫後,`p` 陣列中有幾個元素的值為 0? ```c int K(int p[], int v) { if (p[v] != v) { p[v] = K(p, p[v]); } return p[v]; } void G(int p[], int l, int r) { int a = K(p, l), b = K(p, r); if (a != b) { p[b] = a; } } int main(void) { int p[5] = {0, 1, 2, 3, 4}; G(p, 0, 1); G(p, 2, 4); G(p, 0, 4); return 0; } ``` (A) 1 (B) 2 \(C\) 3 (D) 4 <!-- C --> ## 第 14 題 給定下方 `G()` 函式,執行 `G(1)` 後所輸出的值為何? ```c void G(int a) { printf("%d ", a); if (a >= 3) return; else G(a + 1); printf("%d ", a); } ``` (A) 1 2 3 (B) 1 2 3 2 1 \(C\) 1 2 3 3 2 1 (D) 以上皆非 <!-- B --> ## 第 15 題 下方程式執行後輸出為何? ```c int G(int B) { B = B * B; return B; } int main() { int A = 0, m = 5; A = G(m); if (m < 10) A = G(m) + A; else A = G(m); printf("%d \n", A); return 0; } ``` (A) 0 (B) 10 \(C\) 25 (D) 50 <!-- D --> ## 第 16 題 下方 `G()` 應為一支遞迴函式,已知當 `a` 固定為 `2`,不同的變數 `x` 值會有不同的回傳值如下表所示。請找出 `G()` 函式中 `(a)` 處的計算式該為何? ```c int G(int a, int x) { if (x == 0) return 1; else return ___(a)___; } ``` |a 值|x 值|G(a, x) 回傳值| |-|-|-| |2|0|1| |2|1|6| |2|2|36| |2|3|216| |2|4|1296| |2|5|7776| (A) `((2 * a) + 2) * G(a, x - 1)` (B) `(a + 5) * G(a - 1, x - 1)` \(C\) `((3 * a) - 1) * G(a, x - 1)` (D) `(a + 6) * G(a, x - 1)` <!-- A --> ## 第 17 題 下方 `G()` 為遞迴函式,`G(3, 7)` 執行後回傳值為何? ```c int G(int a, int x) { if (x == 0) return 1; else return (a * G(a, x - 1)); } ``` (A) 128 (B) 2187 \(C\) 6561 (D) 1024 <!-- B --> ## 第 18 題 下方函式若以 `search(1, 10, 3)` 呼叫時, `search` 函式總共會被執行幾次? ```c void search(int x, int y, int z) { if (x < y) { t = ceiling((x + y) / 2); if (z >= t) search(t, y, z); else search(x, t - 1, z); } } // 註:ceiling() 為無條件進位至整數位。例如 ceiling(3.1) = 4, ceiling(3.9) = 4。 ``` (A) 2 (B) 3 \(C\) 4 (D) 5 <!-- C --> ## 第 19 題 給定函式 `A1()`、 `A2()` 與 `F()` 如下,以下敘述何者有誤? ```c void A1(int n) { F(n / 5); F(4 * n / 5); } void A2(int n) { F(2 * n / 5); F(3 * n / 5); } void F(int x) { int i; for (i = 0; i < x; i = i + 1) printf("*"); if (x > 1) { F(x / 2); F(x / 2); } } ``` (A) `A1(5)` 印的 \* 個數比 `A2(5)` 多 (B) `A1(13)` 印的 \* 個數比 `A2(13)` 多 \(C\) `A2(14)` 印的 \* 個數比 `A1(14)` 多 (D) `A2(15)` 印的 \* 個數比 `A1(15)` 多 <!-- D --> ## 第 20 題 下方 `F()` 函式回傳運算式該如何寫,才會使得 `F(14)` 的回傳值為 `40` ? ```c int F(int n) { if (n < 4) return n; else return ___(?)___; } ``` (A) `n * F(n - 1)` (B) `n + F(n - 3)` \(C\) `n - F(n - 2)` (D) `F(3n + 1)` <!-- B --> ## 第 21 題 若以 `B(5, 2)` 呼叫下方 `B()` 函式,總共會印出幾次 "base case"? ```c int B(int n, int k) { if (k == 0 || k == n) { printf("base case\n"); return 1; } return B(n - 1, k - 1) + B(n - 1, k); } ``` (A) 1 (B) 5 \(C\) 10 (D) 19 <!-- C --> ## 第 22 題 若以 `G(100)` 呼叫下方函式後,`n` 的值為何? ```c int n = 0; void K(int b) { n = n + 1; if (b % 4) K(b + 1); } void G(int m) { for (int i = 0; i < m; i = i + 1) { K(i); } } ``` (A) 25 (B) 75 \(C\) 150 (D) 250 <!-- D --> ## 第 23 題 若以 `F(15)` 呼叫下方 `F()` 函式,總共會印出幾行數字? ```c void F(int n) { printf("%d\n", n); if ((n % 2 == 1) && (n > 1)) { return F(5 * n + 1); } else { if (n % 2 == 0) return F(n / 2); } } ``` (A) 16 行 (B) 22 行 \(C\) 11 行 (D) 15 行 <!-- D --> ## 第 24 題 若以 `F(5, 2)` 呼叫下方 `F()` 函式,執行完畢後回傳值為何? ```c int F(int x, int y) { if (x < 1) return 1; else return F(x - y, y) + F(x - 2 * y, y); } ``` (A) 1 (B) 3 \(C\) 5 (D) 8 <!-- C --> ---- ## 解答 |1|2|3|4|5| |-|-|-|-|-| |B|B|B|C|C| |6|7|8|9|10| |-|-|-|-|-| |A|C|B|C|D| |11|12|13|14|15| |-|-|-|-|-| |C|D|C|B|D| |16|17|18|19|20| |-|-|-|-|-| |A|B|C|D|B| |21|22|23|24|25| |-|-|-|-|-| |C|D|D|C|-| [<< APCS 觀念題 - 函式與變數作用域](https://hackmd.io/@kaeteyaruyo/APCS-concept-function) | [目錄](https://hackmd.io/@kaeteyaruyo/APCS-concept-index) | [APCS 觀念題 - 演算法與資料結構 >>](https://hackmd.io/@kaeteyaruyo/APCS-concept-advanced)