代码改变世界

python的递归算法学习(3):汉诺塔递归算法

2017-06-19 10:27  很大很老实  阅读(982)  评论(0编辑  收藏  举报

汉诺塔问题是递归函数的经典应用,它来自一个古老传说:在世界刚被创建的时候有一座钻石宝塔A,其上有64个金蝶。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔B和C。从世界创始之日起,波罗门的牧师就一直在试图把塔A上的碟子移动到C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成这个任务时,世界末日也就到了。 
对于汉诺塔问题的求解,可以通过以下3步实现: 
(1)将塔A上的n -1个碟子借助C塔先移动到B塔上; 
(2)把塔A上剩下的一个碟子移动到塔C上; 
(3)将n - 1个碟子从B塔借助塔A移动到塔C上。 

很显然,这是一个递归求解的过程,假设碟子数n=3时,汉诺塔问题的求解过程如下图所示:

图2

汉诺塔的递归算法

i = 1
def move(n, mfrom, mto) :
  global i
  print("第%d步:将%d号盘子从%s -> %s" %(i, n, mfrom, mto))
  i += 1

def hanoi(n, A, B, C) :
  if n == 1 :
    move(1, A, C)
  else :
    hanoi(n - 1, A, C, B) 
    move(n, A, C)    
    hanoi(n - 1, B, A, C)

#********************程序入口**********************
try :
  n = 3
  print("移动步骤如下:")
  hanoi(n, 'A', 'B', 'C')
except ValueError:
  print("please input a integer n(n > 0)!")