def move_disks(n, from_tower, to_tower, aux_tower):
result = []
###BEGIN SOLUTION
# base case
if n == 1:
return [f"Move disk {n:} from {from_tower:} to {to_tower:}."]
# recursive case
else:
# move n-1 disks from src to an aux tower
result = move_disks(n-1, from_tower, aux_tower, to_tower)
# move nth disk src to dest tower
result = [f"Move disk {n:} from {from_tower:} to {to_tower:}."]
# move n-1 disks from aux to dest
result = move_disks(n-1, aux_tower, to_tower, from_tower)
###END SOLUTION
return result
#Test cases
result = move_disks(3, "A", "B", "C")
print(result)
assert result == ["Move disk 1 from A to B.", "Move disk 2 from A to C.", "Move disk 1 from B to C.", "Move disk 3 from A to B.", "Move disk 1 from C to A.", "Move disk 2 from C to B.", "Move disk 1 from A to B."]
我的疑問是這個。為什么在 move_disks(下圖中)的 n=1 時迭代,對于“from_tower、to_tower 和 aux_tower”分別是 A、B、C。我覺得應該分別是A,C,B。
請參考下面的圖片來查看 python 導師可視化。
在此處輸入影像描述
uj5u.com熱心網友回復:
為什么在 move_disks(下圖中)的 n=1 時迭代,對于“from_tower、to_tower 和 aux_tower”分別是 A、B、C。
因為整個問題的目標是將整個堆疊從 A 移動到 B。這可以從頂層呼叫中看出:move_disks(3, "A", "B", "C"). 在此呼叫中,B 是目標。
現在,當磁盤的數量是奇數時,第一次移動(當n==1)應該是從 A 到 B(C 是輔助的)。在這個特殊的電話中很奇怪move_disks(3, "A", "B", "C")。
請注意,每次執行move_disks都有自己的一組名稱。您已經了解,一次執行中的值與n另一次執行中的值不同,但相同的原則適用于其他引數:呼叫者可以aux_tower作為遞回名稱的值傳遞to_tower,依此類推。
這是 3 個磁盤程序的第一部分的可視化。每個框都是函式的執行。每個盒子都有自己的一組名稱:
move_disks(3, "A", "B", "C")
┌───────────────────────────────────────────────────────────────────┐
│ locals: n=3, from_tower="A", to_tower="B", aux_tower="C" │
│ else-case │
│ result = move_disks(2, "A", "C", "B") │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ locals: n=2, from_tower="A", to_tower="C", aux_tower="B" │ │
│ │ else-case │ │
│ │ result = move_disks(1, "A", "B", "C") │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ locals: n=1, from_tower="A", to_tower="B", aux_tower="C" │ │ │
│ │ │ if-case │ │ │
│ │ │ return ["Move disk 1 from A to B."] │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ result = ["Move disk 2 from A to C."] │ │
│ │ result = move_disks(1, "B", "C", "A") │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ locals: n=1, from_tower="B", to_tower="C", aux_tower="A" │ │ │
│ │ │ if-case │ │ │
│ │ │ return ["Move disk 1 from B to C."] │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ │ return result │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ ...etc
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510104.html
