问题来源:
汉诺塔是根据一个传说形成的一个问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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])
递归过程图解:
水平有限,请多指教!谢谢