python演算法和資料結構筆記--漢諾塔問題超詳細遞迴過程圖解(堆疊資料結構)
阿新 • • 發佈:2018-12-30
兩個盤子時:1移動到B,2移動到A,1移動到C
N個盤子時:n-1移動到B,n移動到A,n-1移動到C
3個盤子為例子,如何將問題歸納為同類的子問題
我們的目標是的第一步先將1,2號盤子移動到B
當3號盤不存在,把B,C柱換個位置,問題轉化為將2個盤子藉助C移動到B子的問題。
要將1,2號盤移動到B,先移動1到C,然後2移動到B,最後1移動到B子問題解決
整個演算法通過遞迴求解。
Python下利用堆疊資料結構實現演算法
利用堆疊結構來實現演算法,沒有從演算法優化的角度考慮,只是覺得好玩,堆疊是用python裡的list實現的。
#----------Stack_base_on_list----------- class Stack(object): def __init__(self): self._stack = [] def push(self, data): self._stack.append(data) def pop(self): if self.isEmpty(): raise ValueError('stack 為空') else: data = self._stack[-1] self._stack.pop() return data def isEmpty(self): if len(self._stack) == 0: return True else: return False def showStack(self): return "Stack:(%s)"%self._stack def stackLen(self): return len(self._stack) #--------------Init_Hanoi_Tower------------------------------ A_pillar = Stack() B_pillar = Stack() C_pillar = Stack() #-------------------------------- A_pillar.__init__() B_pillar.__init__() C_pillar.__init__() #-------------------------------- n = int(input('How many cake? ')) for i in range(n): A_pillar.push(n-i) #-------------------------------- print('A',A_pillar.showStack()) print('B',B_pillar.showStack()) print('C',C_pillar.showStack()) #-------------------------------- def move(from_,to_): cake = from_._stack[-1] from_.pop() to_.push(cake) print('-------move[%s]---------'%cake) print('A', A_pillar.showStack()) print('B', B_pillar.showStack()) print('C', C_pillar.showStack()) return cake def hanoiTower(n, from_, base_, to_): if n == 1: move(from_, to_) else: hanoiTower(n-1, from_, to_, base_) move(from_, to_) hanoiTower(n-1, base_, from_, to_) hanoiTower(n, A_pillar, B_pillar, C_pillar)
執行結果:
How many cake? 3
A Stack:([3, 2, 1])
B Stack:([])
C Stack:([])
-------move[1]---------
A Stack:([3, 2])
B Stack:([])
C Stack:([1])
-------move[2]---------
A Stack:([3])
B Stack:([2])
C Stack:([1])
-------move[1]---------
A Stack:([3])
B Stack:([2, 1])
C Stack:([])
-------move[3]---------
A Stack:([])
B Stack:([2, 1])
C Stack:([3])
-------move[1]---------
A Stack:([1])
B Stack:([2])
C Stack:([3])
-------move[2]---------
A Stack:([1])
B Stack:([])
C Stack:([3, 2])
-------move[1]---------
A Stack:([])
B Stack:([])
C Stack:([3, 2, 1])
遞迴過程圖解:
水平有限,請多指教!謝謝