1.下列哪一個敘述最接近「遞迴(recursion)」的概念?
(A) 函式在執行過程中呼叫自己
(B)程式碼重複貼上很多次
(C)同一行程式碼同時在多個 CPU 上執行
(D)使用者多次輸 入相同資料
統計: A(15), B(1), C(1), D(1), E(0) #3678232
詳解 (共 1 筆)
【解題思路】
先抓關鍵字:「遞迴 recursion」「最接近的敘述」「函式」「呼叫自己」。
考點只有一個:
你知不知道「遞迴」的正式定義是什麼。
標準定義(先記住這句):
遞迴就是「函式在執行的過程中,又呼叫自己本身」,而且
會一直呼叫下去,直到「遇到停止條件」才往回收。
逐一看選項:
(A) 函式在執行過程中呼叫自己
→ 正中定義,就是遞迴本身。
(B) 程式碼重複貼上很多次
→ 這只是「複製貼上」或「迴圈展開」,跟遞迴無關。
(C) 同一行程式碼同時在多個 CPU 上執行
→ 這是在講平行運算、多核心、多執行緒,不是遞迴。
(D) 使用者多次輸入相同資料
→ 這只是輸入動作重複,完全不牽涉到函式自己呼叫自己。
所以答案一定是 (A)。
【為什麼其他選項不正確(逐一破題)】
(B) 程式碼重複貼上很多次
很多同學直覺以為「重複」=「遞迴」。
錯,遞迴是「一個函式自己呼叫自己」,
不是你手動把同一段 code 複製很多遍。
(C) 同一行程式碼同時在多個 CPU 上執行
這是「平行計算」或「多執行緒」,和遞迴是兩個不同概念。
遞迴不一定平行,平行也不一定要遞迴。
(D) 使用者多次輸入相同資料
這只是使用者操作上的「重複」,不是程式結構上的「遞迴」。
【延伸知識:什麼是遞迴?用高中程度徹底講清楚】
先給一句「人話版定義」:
遞迴:
叫別人做事,結果那個人又用一樣方式再叫別人做事,
一直傳下去,最後最小的那個人真的做完,再一層一層往回報告。
用程式的語言說:
-
有一個函式 f
-
在 f 的裡面,又呼叫了 f 本身(自己叫自己)
-
但不能無限叫,所以一定要有「停損點(終止條件、base case)」
-
當條件成立,就不再呼叫自己,而是回傳結果
-
回傳結果往上一層一層疊回去,最後完成整個計算
你可以把遞迴拆成兩塊:
-
Base case(終止條件):不再往下,直接給答案
-
Recursive case(遞迴情況):把大問題拆成比較小的同類問題,丟給「自己」處理
【用一個例子:1 × 2 × 3 的階乘 factorial(3)】
定義:
n! = n × (n-1)!,而 1! = 1
寫成遞迴的觀念:
-
終止條件:
如果 n = 1,就回傳 1(不再呼叫自己) -
遞迴情況:
如果 n > 1,就回傳 n × factorial(n-1)
以 3! 為例:
-
呼叫 factorial(3)
→ 不是 1,所以算:3 × factorial(2) -
factorial(2)
→ 不是 1,所以算:2 × factorial(1) -
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!:
用迴圈寫:
用遞迴寫:
重點差別:
-
迴圈:自己控制「重複次數」
-
遞迴:用「函式呼叫自己」讓問題不斷縮小,直到 base case
有些問題用遞迴寫會比較直覺,例如:
-
樹狀結構(資料夾、樹、圖)走訪
-
分割問題(快速排序、合併排序)
-
數學上的遞迴定義(費波那契數列、階乘等)
【記憶技巧】
幾個好記的方法:
-
口訣:
「大問題丟給自己未來的自己。」
「遞迴就是:自己叫自己,一路叫到不能叫。」 -
比喻:
像一層一層的便當盒(俄羅斯娃娃):
最外層打開 → 裡面還有一層 → 一直打開
最小那層吃完(base case)
再一層一層裝回去(return)
【常見錯誤】
-
只有遞迴呼叫,沒有終止條件
→ 程式會一直呼叫自己,最後「堆疊溢位」(stack overflow),程式當掉。 -
終止條件寫錯
→ 看起來有停損點,但永遠到不了那個條件,也會無限遞迴。 -
把「重複」就當成遞迴
→ 例如認為「輸入三次」或「for 迴圈」就是遞迴,這是觀念混淆。
你可以記:
「遞迴一定有自己呼叫自己 + 終止條件,兩個缺一不可。」