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


问题来源:

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

算法分析:

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


两个盘子时: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])

递归过程图解:



水平有限,请多指教!谢谢
  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值