什麼是遞迴?
遞迴(Recursion)是函數「呼叫自身」的程式設計技巧。它必須有:
河內塔的遞迴解
目標:把 n 個圓盤從 A 柱移到 C 柱,每次只能移動一個,大盤不能放在小盤上。
思路分三步:
def hanoi(n, from_rod, to_rod, via_rod):
if n == 1: # Base case
print(f"Move disk 1: {from_rod} -> {to_rod}")
return
hanoi(n - 1, from_rod, via_rod, to_rod) # Step 1
print(f"Move disk {n}: {from_rod} -> {to_rod}") # Step 2
hanoi(n - 1, via_rod, to_rod, from_rod) # Step 3
hanoi(3, 'A', 'C', 'B')
# Move disk 1: A -> C
# Move disk 2: A -> B
# Move disk 1: C -> B
# Move disk 3: A -> C
# Move disk 1: B -> A
# Move disk 2: B -> C
# Move disk 1: A -> C
時間複雜度
最少步數 = 2^n - 1。
呼叫堆疊視覺化
遞迴的核心是「函數在記憶體中疊加呼叫」,每次呼叫都在堆疊(Stack)上新增一層。
hanoi(3, A, C, B)
hanoi(2, A, B, C)
hanoi(1, A, C, B) → 印出 "Move disk 1: A -> C"
印出 "Move disk 2: A -> B"
hanoi(1, C, B, A) → 印出 "Move disk 1: C -> B"
印出 "Move disk 3: A -> C"
hanoi(2, B, C, A)
...
前往互動河內塔遊戲,用拖放操作親自驗證!