用递归法求汉诺塔问题Python,汉诺塔求解python

  用递归法求汉诺塔问题Python,汉诺塔求解python

  前情提要:

  我先解释一下汉诺威的游戏规则。如下图所示,有A、B、C三个立柱,我们需要做的就是把a柱上的磁盘全部转移到C柱上。转让时,规则如下。

  1.一次只能移动一张光盘。

  2.所有大磁盘必须在小磁盘下面。

  过程分析

  首先,假设只有一张光盘。将数字设置为1,如下图所示。这时候直接把A移到c就行了。

  假设有两个磁盘,移动过程如下:

  第一步:首先把1号盘从A移到B;

  (步骤2)将第二张盘从A移动到C;

  步骤3:最后,将第一个磁盘从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是目标列。

  至此,函数的编写在我脑海中大致形成了一个形状。

  函数定义

  根据上面的分析,函数的参数有三列:disk,A,B,c,因此,函数的签名是move(n,A,B,c)。这里,n代表磁盘数,a代表起始列,b代表辅助列,c代表目标列。

  根据以上三个磁盘的分析,得到的函数定义如下(Python代码)。

  1defmove(n,a,b,c ) :2 IFN==1:3 printa - C4返回

  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列。

  呼叫代码如下。(四个磁盘)。

  1移动(4, a , b , c )

  结果如下。

  A - B

  A - C

  B - C

  A - B

  大六度

  大七度

  A - B

  A - C

  B - C

  B - A

  大六度

  B - C

  A - B

  A - C

  B - C

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: