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

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

  00-1010前言一、问题描述二、问题分析三、解决方案四、例题

  00-1010博主之前写过递归的思维模式:

  递归思维

  这种思维模式将被用来解决经典的汉诺塔问题。

  00-1010河内塔(又称河内塔)的问题源于一个古老的印度传说。梵天创造世界的时候做了三根钻石柱子,柱子上自下而上叠放了64个黄金圆盘。

  梵天命令梵天从下面按大小顺序重新排列另一根柱子上的圆盘。

  此外,还规定在小盘上不能放大盘,一次只能在三列之间移动一个盘。

  请教如何操作?

  以下是玩法:

  1.有三根杆子A,B,C,B,C,吧台A上有一些菜。

  2.一次搬一个菜,小的只能叠在大的上面。

  3.将所有菜肴从A栏移到C栏。

  00-1010(两步直接解决问题)

  1.第一步(先想想终止条件)

  考虑n=1的情况:

  把这个街区从A移到c。

  2.第二步(宏观看待整个问题)

  当n=2时,把蓝框想象成上面的n-1块(我称之为一堆块),红框代表最下面的块(命名为最下面的块),这样问题就可以简化为如图所示的三个步骤。

  第一步:首先,将上述块从A(起始列)移动到B(目标列)。在这个过程中,C(辅助柱)起到了中转的作用(因为题目要求运动时小盘要在大盘上)

  第二步:将底部大红色块直接从A(起始列)移动到C(目标列)。请注意,此步骤的目标列不同于第一步的目标列。

  第三步:将上述块从B(起始列)移动到C(目标列),A(辅助列)作为中转。

  00-1010那么问题就很简单了。递归代码分为两部分:终止条件和递归逻辑。

  上一篇博客提到,当我们考虑递归的时候,可以直接把这个大问题拆解成很多子问题。假设这个函数已经被别人写好了(也就是这个递归函数),对于我们做不到的函数,我们可以直接调用这个递归函数(注意逻辑)。

  公共类递归{公共静态void main(String[]args){ int n=3;hanoiTower(n, A , B , C );}/* * *传入n个盘子,从1开始编号.n,而我可以遵循汉诺塔的规则,从目标盘A-C,B是辅助盘* @param nDisks * @param A起始列* @param B辅助列* @param C目标列*/public static void Hanoi Tower(int n disks,char a,char b,C) {//boundary if (nDisks==1) {//取小于B,A上的这个盘从A-C (NDisks,A,C)移动;返回;} //n=2,核心步骤1,先从A-B,C上取n -1个小板块作为辅助hanoiTower(nDisks-1,A,C,B);//核心步骤2。此时在A上留下第n块板,一步到位把最大的板一次移动到C move(nDisks,A,C);//核心步骤3。此时从B-C,A中取B上的这n-1块板作为辅助hanoiTower(nDisks-1,B,A,C);}/* * *将编号为N的板块从sourceTower移动到Dest Tower * @ param ndsks * @ param source Tower * @ param Dest Tower */public static void Move(int ndsks,Char Tower,Char Dest Tower){ system . out . println( nDisks 的板块从 sourceTower - destTower)移动;}

  00-1010n=3

  以上是用宏观思维递归求解汉诺塔的方法。希望大家多多支持(ˇˇ)

  关于Java递归解决汉诺塔问题的这篇文章到此结束。想了解更多关于Java Hanoi Tower的信息,请搜索之前关于热门IT的文章或者继续浏览以下相关文章。我希望你将来能支持流行它!

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

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