汉诺威算法
汉诺威
要用递归函数解决问题,必须完成递归的结束条件、递归公式这两个基本要素。 为了分析递归函数,以下分为3个步骤考虑这个问题。 说明: A.B.C分别表示三根柱子; 1、2、3分别表示3个圆盘,数字越大表示圆盘越大。
现在,我需要把a的所有圆盘移动到c
只有一个圆盘: 1
A - C
有两个圆盘。 一、二
A - B
A - C
B - C
有三个圆盘。 一、二、三
A - C
A - B
C - B
A - C
B - A
B - C
A - C观察以上结果后,每次最重要的一步是将A中最大的圆盘移动到C。
(1) a-c
)2) a-c
)3) a-c
)将A-C以上部分和以下部分加粗,可以看出其实是与完全相似的过程。 对于上面部分,使1.2个圆盘从起点a向终点b移动; 对于下面的部分,将1.2个圆盘从起点b移动到终点c (对于,将1.2个圆盘从a移动到c )。
因此的过程可以完全重复的过程来实现。 这也就是递归的思想。
在此定义函数后,#上面的部分: n-1个圆盘可以表示为a-bmov (从n-1,a,c,b ) #的中间部分开始)吗? #下方部分: b-cmov(n-1,b,a,c )至n-1个圆盘
这里是递归公式的表现。 最后,返回递归的结束条件:,每次最后的圆盘从A-C开始。 也就是上述代码中的中间部分#中间部分mov(1,a,b,c ) )
算法实现了---编码: UTF-8---def mov (n,a,b,c ) :
if n==1:
print(a,'-',c ) else:
mov(n-1,a,c,b ) ) ) )。
mov(1,a,b,c ) ) )。
mov(n-1,b,a,c ) ) )。
num=input ('请输入要移动的圆盘数量:')
mov(int(num )、' a )、' b )、' c ' )
程序截图
参考资料
作者: LeeLom
链接: https://www.Jian Shu.com/p/b 04087 DC6fdf