1.下列哪一個敘述最接近「遞迴(recursion)」的概念?
(A) 函式在執行過程中呼叫自己
(B)程式碼重複貼上很多次
(C)同一行程式碼同時在多個 CPU 上執行
(D)使用者多次輸 入相同資料

答案:登入後查看
統計: A(15), B(1), C(1), D(1), E(0) #3678232

詳解 (共 1 筆)

#7213537

【解題思路】

先抓關鍵字:「遞迴 recursion」「最接近的敘述」「函式」「呼叫自己」。

考點只有一個:
你知不知道「遞迴」的正式定義是什麼。

標準定義(先記住這句):
遞迴就是「函式在執行的過程中,又呼叫自己本身」,而且
會一直呼叫下去,直到「遇到停止條件」才往回收。

逐一看選項:

(A) 函式在執行過程中呼叫自己
→ 正中定義,就是遞迴本身。

(B) 程式碼重複貼上很多次
→ 這只是「複製貼上」或「迴圈展開」,跟遞迴無關。

(C) 同一行程式碼同時在多個 CPU 上執行
→ 這是在講平行運算、多核心、多執行緒,不是遞迴。

(D) 使用者多次輸入相同資料
→ 這只是輸入動作重複,完全不牽涉到函式自己呼叫自己。

所以答案一定是 (A)。

【為什麼其他選項不正確(逐一破題)】

(B) 程式碼重複貼上很多次
很多同學直覺以為「重複」=「遞迴」。
錯,遞迴是「一個函式自己呼叫自己」,
不是你手動把同一段 code 複製很多遍。

(C) 同一行程式碼同時在多個 CPU 上執行
這是「平行計算」或「多執行緒」,和遞迴是兩個不同概念。
遞迴不一定平行,平行也不一定要遞迴。

(D) 使用者多次輸入相同資料
這只是使用者操作上的「重複」,不是程式結構上的「遞迴」。

【延伸知識:什麼是遞迴?用高中程度徹底講清楚】

先給一句「人話版定義」:

遞迴:
叫別人做事,結果那個人又用一樣方式再叫別人做事,
一直傳下去,最後最小的那個人真的做完,再一層一層往回報告。

用程式的語言說:

  1. 有一個函式 f

  2. 在 f 的裡面,又呼叫了 f 本身(自己叫自己)

  3. 但不能無限叫,所以一定要有「停損點(終止條件、base case)」

  4. 當條件成立,就不再呼叫自己,而是回傳結果

  5. 回傳結果往上一層一層疊回去,最後完成整個計算

你可以把遞迴拆成兩塊:

  1. Base case(終止條件):不再往下,直接給答案

  2. Recursive case(遞迴情況):把大問題拆成比較小的同類問題,丟給「自己」處理

【用一個例子:1 × 2 × 3 的階乘 factorial(3)】

定義:
n! = n × (n-1)!,而 1! = 1

寫成遞迴的觀念:

  • 終止條件:
    如果 n = 1,就回傳 1(不再呼叫自己)

  • 遞迴情況:
    如果 n > 1,就回傳 n × factorial(n-1)

以 3! 為例:

  1. 呼叫 factorial(3)
    → 不是 1,所以算:3 × factorial(2)

  2. factorial(2)
    → 不是 1,所以算:2 × factorial(1)

  3. factorial(1)
    → 終止條件,直接回傳 1

然後開始「往回收」:

  • factorial(1) 回傳 1

  • factorial(2) = 2 × 1 = 2

  • factorial(3) = 3 × 2 = 6

整個呼叫順序像這樣:

往下拆:
factorial(3)
→ factorial(2)
→ factorial(1)

往上收:
factorial(1) = 1
→ factorial(2) = 2
→ factorial(3) = 6

這就是典型的遞迴流程:
「一層一層往下叫,一層一層往上收。」

【遞迴 vs 迴圈(for / while)】

很多同學會問:遞迴一定比迴圈高級嗎?
不一定,大多數情況都可以互相轉換。

例如剛剛 3!:

用迴圈寫:

ㅤㅤ
ans = 1 for i in range(1, 4): ans *= i

用遞迴寫:

ㅤㅤ
def fact(n): if n == 1: return 1 # 終止條件 return n * fact(n-1) # 遞迴呼叫

重點差別:

  • 迴圈:自己控制「重複次數」

  • 遞迴:用「函式呼叫自己」讓問題不斷縮小,直到 base case

有些問題用遞迴寫會比較直覺,例如:

  • 樹狀結構(資料夾、樹、圖)走訪

  • 分割問題(快速排序、合併排序)

  • 數學上的遞迴定義(費波那契數列、階乘等)

【記憶技巧】

幾個好記的方法:

  1. 口訣:
    「大問題丟給自己未來的自己。」
    「遞迴就是:自己叫自己,一路叫到不能叫。」

  2. 比喻:
    像一層一層的便當盒(俄羅斯娃娃):
    最外層打開 → 裡面還有一層 → 一直打開
    最小那層吃完(base case)
    再一層一層裝回去(return)

【常見錯誤】

  1. 只有遞迴呼叫,沒有終止條件
    → 程式會一直呼叫自己,最後「堆疊溢位」(stack overflow),程式當掉。

  2. 終止條件寫錯
    → 看起來有停損點,但永遠到不了那個條件,也會無限遞迴。

  3. 把「重複」就當成遞迴
    → 例如認為「輸入三次」或「for 迴圈」就是遞迴,這是觀念混淆。

你可以記:
「遞迴一定有自己呼叫自己 + 終止條件,兩個缺一不可。」

0
0