汉诺塔问题递归算法实现过程,使用递归方法实现汉诺塔问题的求解编程

  汉诺塔问题递归算法实现过程,使用递归方法实现汉诺塔问题的求解编程

  python实现汉诺塔递归算法的经典案例

  来源:中文来源网站浏览:日期:2018年9月2日

  【下载文档:python经典案例Hanoi递归算法。txt]

  (友情提示:右键单击上行txt文档的名称-目标另存为)

  Python实现汉诺塔递归算法的经典案例。学习递归的时候,有一个汉诺塔的练习。汉诺塔应该是学习计算机递归算法的经典入门案例,所以我觉得可以写个博客来表达一下我的看法。这个markdown编辑器不太会用。可能写的格式有点难看。请原谅我。

  我在网上找到一张河内塔的照片。汉诺塔是用中间的柱子把最左边柱子上的圆盘由大到小依次叠起来。说白了,C应该像原A一样废话少说,先轻代码。

  定义移动(n,a,buffer,c):

  如果(n==1):

  打印(a,-,c)

  返回

  移动(n-1,a,c,缓冲区)

  移动(1,a,缓冲区,c)

  移动(n-1,缓冲区,a,c)

  Move(3, a , b , c )首先定义一个移动函数。四个参数代表A列的板数,buffer是b列,命名为buffer是为了便于理解。顾名思义,它是A移动到C的缓冲区,那么C就是目标列。

  让我们来读功能代码。

  递归的一般写法,必须有一个停止递归循环的条件,这样就可以在判断A列的板数为1时停止递归并返回。当A列只有一个盘子时,必须把A移到c,重点是下面这段代码。递归实际上是一种非常抽象的算法。我们要用抽象思维来思考汉诺塔的问题,把A柱上的板块想成两部分,分别是上盘和下盘。如图所示,如果我们不在乎上面有几块板,那么每次操作时,我们都会通过缓冲区B列缓冲区将下面的板移动到C列。

  童鞋们一定在想为什么要把酱紫搬走。其实这是一种总结。你会发现自己玩河内塔游戏的规则。这个游戏其实就是不断尝试把上面的都移到B,然后得到A到C的最后最大的一个,然后绞尽脑汁把B上的那个移到C上,这个时候你会发现B上原来的那个要通过空的那个,也就是A,把B上当前的n-1个都存到B上,然后把B的最大最后一个移到C上,这个规律就体现出来了,可以抽象出移动的方法,可以在此基础上设计程序算法。让我们用刚才的抽象思维来解读剩下的代码。

  移动(n-1,a,c,缓冲区)

  这个代码的意思是,刚才提到的a柱上面的n-1位,会按照从小到大的规则,先被C移动到缓冲区。这个函数进入递归。

  移动(1,a,缓冲区,c)

  当执行上述语句时,也就是n-1块板的递归移动完成后,执行这条语句就是将A列上的一块板移动到C列,也就是所谓的底板。

  移动(n-1,缓冲区,a,c)

  最后一步是将A上的n-1全部移动到刚才的缓冲区。整个汉诺塔可以通过A移动到C是肯定的,所以最后一步自然是把刚才的n-1通过A移动到C列作为缓冲。

  我把整个搬家过程写下来,以a柱上的三个为例。

  /**

  我用代码演示了河内塔的所有三个板块。根据缩进的原理,每次缩进都会进入一个递归函数,每次打印也就是每次打印都会停止当前的递归。

  描述:

  1.n=3,n=2,n=1是if(n==1)每次执行的结果,这里不写判断。相信童鞋也能理解,就是当n不等于1时,减1进入递归。

  2.请注意A、B、C列每次进入函数的顺序。不要被形式参数误导,看每个函数参数的实际参数。

  **/

  移动(3, a , b , c )

  n=3:

  //从A开始移动n-1,即通过C移动2块板到B,为A的最后一块板移动腾出C。

  移动(2, a , c , b )

  n=2:

  //从n=2开始递归,将当前a(a )列上的n-1个图板移动到b(c )到c(b )

  移动(1, a , b , c )

  n=1:

  //完成n=2的第一次递归,打印结果,执行当前子函数的剩余代码。

  打印( a ,-, c )

  移动(1, a , c , b )

  n=1:

  打印( a ,-, b )

  移动(1, c , a , b )

  n=1:

  打印( c ,-, b )

  //这里a柱上面的n-1是2个板块的移动。

  //开始将A列的最后一块板移到c列。

  移动(1, a , b , c )

  n=1:

  打印( a ,-, c )

  //到这里完成将A列的最后一个盘子移到c列。

  移动(2, b , a , c )

  n=2:

  //开始n=2的第二次递归,即通过a(a )移动当前b(b )到c(c )的板块(n-1)

  移动(1, b , c , a )

  n=1:

  //完成n=2的第二次递归,打印结果并执行当前子函数的剩余代码。

  打印( b ,-, a )

  移动(1, b , a , c )

  n=1:

  打印( b ,-, c )

  移动(1, a , b , c )

  n=1:

  打印( a ,-, c )

  //到这里,通过A把B上的盘子移到C上,

  //整个代码执行后,汉诺塔移动的最终打印结果是:童鞋们在了解了汉诺塔递归算法的原理后,可以写个程序试试。在这里,他们只学了Python的递归,所以用Python,童鞋可以用其他语言实现。汉诺塔确实可以帮助理解递归的原理,递归在程序设计中的重要性不言而喻!

  亲爱的,试试微信扫码分享这个页面吧!*^_^*

汉诺塔问题递归算法实现过程,使用递归方法实现汉诺塔问题的求解编程