python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第1张图片

问题来源:

汉诺塔是根据一个传说形成的一个问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

算法分析:

当只有一个盘子时:直接把A移动到C

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第2张图片

两个盘子时:1移动到B,2移动到A,1移动到C

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第3张图片

N个盘子时:n-1移动到B,n移动到A,n-1移动到C

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第4张图片

3个盘子为例子,如何将问题归纳为同类的子问题

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第5张图片



我们的目标是的第一步先将1,2号盘子移动到B

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第6张图片

当3号盘不存在,把B,C柱换个位置,问题转化为将2个盘子借助C移动到B子的问题。

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第7张图片


要将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])

递归过程图解:

python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)_第8张图片

水平有限,请多指教!谢谢

你可能感兴趣的:(python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构))