前情提要:
让我先解释一下汉诺威的游戏规则。 如下图所示,有三根柱子a、b、c。 我们要做的是把a柱上的所有圆盘,全部转移到C柱上。 转移时遵循的规则如下。
1、一次只能移动一个圆盘
2、所有大圆盘都必须在小圆盘下
过程分析
首先假设只有一个圆盘。 将号码设为1,如下图所示。 这时,把a直接移动到c就可以了。
假设有两个圆盘,移动过程如下:
步骤1 :首先将1号盘从a移动到b;
(步骤2 )将第二盘从a移动到c;
步骤3 :最后将第1个磁盘从b移动到c,完成迁移。
好吧,让读者耐心一点,看看三个圆盘的转移过程是怎么进行的。 ((这里用文字说明,请让读者发挥想象。 )
首先,三个圆盘放置在a柱上,从上到下依次为编号1、2、3 (最小的为1,最大的为3 )。 首先,我们只考虑上面两个lgdhk点的圆盘)编号1、2 ),而不是3号盘。 前面分析了两个圆盘的移动过程,这两个圆盘应该移动到哪个柱上呢? 目前只有B柱可以选择,但C柱绝对不行。 因为C柱是目标柱,所以把1、2号盘从A柱移动到B柱,在C柱的帮助下,移动过程是A-C、A-B、C-B。 此时,1、2号盘已经到达B柱,将最大的3号盘直接移动到C柱。 工作在这个时候结束。 现在的状态是,1、2号盘在B柱,3号盘达到了目标C柱。 接下来,将1、2号盘从B柱移动到C柱,转移工作完全结束。 根据a柱的不同,转移过程是B-A、B-C、A-C。
从上面第一段加入红色的文字可以看出,a是开始柱,b是目标柱,c是辅助柱,从第二段加入红色的文字可以看出,b是开始柱,a是辅助柱,c是目标柱。
此时,函数的写法大致在脑海中形成了形状
函数定义
根据上面的分析可知,函数的参数有盘、a、b、c三个柱。 因此,函数的签名是move(n,a,b,c )。 这里,n表示圆盘的个数,a表示开始柱,b表示辅助柱,c表示目标柱。
根据对上述3个圆盘的分析,得到的函数定义如下(Python码)。
1defmove(n,a,b,c ) :2 IFN==1:3 printa '-- ' C4 return
5move(n-1,a,c,b )6printa '-- ' c7m ove (n-1,b,a,c ) )。
代码解释:
如果n=1,即只有一个圆盘,则直接输出a - c,即把圆盘从a移动到c (对应于第2、3行代码) ) )。
如果为n1,则处理第一个n-1圆盘,将第一个n-1圆盘从A移动到B柱,通过C柱(对应于第5行代码),接下来将第n个圆盘从A柱移动到C柱,最后将剩下的n-1圆盘,B柱移动到C柱
调用代码如下。 (四个圆盘)。
1move(4,' a ',' b ',' c ' )
结果如下。
A--B
A--C
B--C
A--B
C--A
C--B
A--B
A--C
B--C
B--A
C--A
B--C
A--B
A--C
B--C