漢諾塔是一種經典的遞歸問題。我們可以使用 python 的堆棧(Stack)來實現漢諾塔算法。
# 定義一個 Stack 類 class Stack: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items) # 漢諾塔算法 def hanoi(n, source, target, auxiliary): if n == 1: target.push(source.pop()) else: hanoi(n-1, source, auxiliary, target) target.push(source.pop()) hanoi(n-1, auxiliary, target, source) # 測試 source = Stack() auxiliary = Stack() target = Stack() n = 4 for i in range(n, 0, -1): source.push(i) hanoi(n, source, target, auxiliary) while not target.is_empty(): print(target.pop())
代碼解釋:
首先定義一個 Stack 類,包含 is_empty、push、pop、peek 和 size 方法。
然后定義漢諾塔算法 hanoi,接收三個參數:n 表示盤子數量,source 表示起源柱,target 表示目標柱,auxiliary 表示輔助柱。
如果盤子數量為 1,則直接將起源柱的盤子移動到目標柱。
如果盤子數量不為 1,則先把 n-1 個盤子從起源柱移動到輔助柱,然后將起源柱上最后一個盤子移動到目標柱,最后將輔助柱上的 n-1 個盤子移動到目標柱。
最后,我們可以將 n 個盤子從起源柱移動到目標柱,并打印出最終的目標柱狀態。