用递归函数解决汉诺塔移动问题。
汉诺塔的定义:
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