1. 程式人生 > >python演算法和資料結構筆記--漢諾塔問題超詳細遞迴過程圖解(堆疊資料結構)

python演算法和資料結構筆記--漢諾塔問題超詳細遞迴過程圖解(堆疊資料結構)

兩個盤子時: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])

遞迴過程圖解:



水平有限,請多指教!謝謝