用递归函数解决汉诺塔移动问题。

汉诺塔的定义:

  1、总共更有三个柱子,在第一根柱子上,从下往上按从大到小的顺序叠放着一堆盘子,即下大上小;

  2、每次只能移动一个盘子,且大盘子不能放在小盘子上面,即保证每根柱子上盘子都是下大上小;

  3、最终目标是把盘子从左边第一根柱子,移动到右边第三个柱子。

利用递归函数解决汉诺塔移动:

假定有n个盘子,从左到右依次有a,b,c三个柱子。刚开始n个盘子都在a柱子上。

若n=1,直接把盘子从a移动到c;

若n>1,则:

第一步:把a柱子上除最下面的那个盘子外的n-1个盘子,全部移动到b柱子上;

第二步:把a柱子上最下面的那个盘子,移动到c柱子上;

第三步:把b柱子上的n-1个盘子,全部移动到c柱子上;

代码如下:

def move(n,a,b,c):
    if n==1:
        print('move',a,'-->','c') #圆盘个数为1时,从a移动到c即可完成,用来终止递归
    else:
        move(n-1,a,c,b)  #把除了a柱子最下的一个圆盘以外的其他圆盘,都移动到b柱子
        move(1,a,b,c)    #把a柱子最下的圆盘,移动到c柱子
        move(n-1,b,a,c)  #把b柱子上的n-1个盘子,全部移动到c柱子

假定n=3,该程序执行过程如下:

move(3,a,b,c)

move(3,a,b,c)
    move(2,a,c,b)      #a柱上面两个盘子,移动到b柱子
        move(1,a,b,c)    #a柱最上面一个盘,移动到b柱。对函数move(2,a,c,b),其‘a’柱为a,‘b’柱为 c。因n=1,执行print语句,a-->c
        move(1,a,c,b)    #a柱子最下面盘子移动到c柱子。对于move(2,a,c,b)函数,其‘c’柱子为 b。因n=1,执行print语句,a-->b
        move(1,c,a,b)    #b柱子上的一个盘子移动到c柱子。对于move(2,a,c,b)函数,其‘b’柱子为 c,'c'柱为b。因n=1,执行print语句,c-->b
    move(1,a,b,c)      #a柱最下面盘子,移动到c柱子。因n=1,执行print语句,a-->c
    move(2,b,a,c)      #b柱上的两个盘,移动到c柱
        move(1,b,c,a)    #a柱最上面一个盘,移动到b柱。对函数move(2,b,a,c),其‘a’柱为b,‘b’柱为a。因n=1,执行print语句,b-->a
        move(1,b,a,c)    #a柱最下面的盘移动到c柱。对move(2,b,a,c)函数,其‘a’柱为b,‘c’柱为c。因n=1,执行print语句,b-->c
        move(1,a,b,c)    #b柱上的一个盘移动到c柱。对move(2,b,a,c)函数,其‘b’柱为a,‘c’柱为c。因n=1,执行print语句,a-->c

#程序依次执行,显示的顺序为:
move a-->c
move a-->b
move c-->b
move a-->c
move b-->a
move b-->c
move a-->c

 

posted @ 2017-11-01 17:56  海盗洁哥  阅读(5401)  评论(0编辑  收藏  举报