汉诺塔的实现,是一个典型的递归问题,当然越是复杂的递归问题越是考验人的抽象思维;
哈哈哈,言归正传,汉诺塔问题如下:
请编写move(n, a, b, c)函数
它接收参数n:表示3个柱子A、B、C中第1个柱子A上的圆盘数量
然后打印出把所有盘子从A借助B移动到C的方法;
下面我们分步来解析:
第一步,抽象出函数的意义:
def move(n,a,b,c): #函数的抽象意义就是:把n个圆盘从a柱上借助b柱移动到c柱上;
第二步,退一步抽象:
如果我们想把n个圆盘从a柱上借助b柱移动到c柱上,那么我们需要先把n-1个圆盘从a柱借助c柱移动到b柱上;
1.JPG
既然我们刚才已经抽象出了move(n,a,b,c)函数的意义是把n个圆盘从a柱上借助b柱移动到c柱上;
那么我们第二步需要n-1个圆盘从a柱借助c柱移动到b柱上
调用函数表达就是:move(n-1,a,c,b)
第三步:
然后,我们需要把a柱上剩余的一个圆盘借助b柱移动到c柱;
2.JPG
同理,我们第三步需要把a柱上剩余的一个圆盘借助b柱移动到c柱
调用函数表达就是:move(1,a,b,c)
第四部:
最后,我们需要把n-1个圆盘从b柱上借助a柱移动到c柱上;
3.JPG
同理,第四步需要把n-1个圆盘从b柱上借助a柱移动到c柱上
调用函数表达就是:move(n-1,b,a,c)
通过上面四步基本已经完成了递归函数的实现,只需要再加上n=1时的额外判断即可;
代码如下
#汉诺函数
def move(int,a,b,c):
if int==1:
print(a,'-->',c)
return
move(int-1,a,c,b)
move(1,a,b,c)
move(int-1,b,a,c)
def main():
#将三个圆盘从A柱移动到C柱
move(3,'A','B','C')
最终,运行输出结果如下:
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
网友评论