汉诺塔思想及代码解析
如果要将A柱上的n个盘子移到C柱上,就需要
先将前n-1个盘子从A柱借助C柱移到B柱,这时A柱上只剩下了第n个盘子
直接将第n个盘子从A柱移到C柱
再将B柱上的n-1个盘子借助A柱移到C柱
但是,如何将前n-1个盘子从A柱借助C柱移到B柱上去呢?就需要
先将前n-2个盘子借助B柱移到C柱
直接将第n-1个盘子从A柱移到B柱
再将C柱上的n-2个盘子借助A柱移到B柱
虽然两者借助的柱子不同
但是,移动n个盘子和移动n-1个盘子是等价的
这里给出伪算法
if(只有一个盘子) 直接将盘子从A移到Celse 先将前n-1个盘子借助C柱移到B柱 直接将第n个盘子从A柱移到C柱 再将B柱上的n-1个盘子借助A柱移到C柱
用python写出的代码
def move(n,A,B,C):# if(n==1): print(A+'->'+C) else: move(n-1,A,C,B) print(A+'->'+C) move(n-1,B,A,C)
注意,print(A+'->'+C)这条语句,并不是要打印形参A和形参C对应的实参值,而是打印move这个函数第二个和第四个形参所对应的实参。在每次循环调用中,形参所对应的实参都是会变的。
我们来看个实例,调用
move(3,'A','B','C')
函数具体实现如下:
在函数执行过程中,我认为它的执行顺序和数据结构的栈一样,遇到一条打印语句先把它压到栈中,直到循环结束,先执行最后进栈的print语句,最后执行第一个进栈的print语句。
希望这篇文章能够帮到大家,如有错误请多多指正。