汉诺塔问题递归算法

1 篇文章 0 订阅
0 篇文章 0 订阅

1.题目:
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
2.分析:
这个问题显然需要用递归算法来解决,我们知道递归可以理解为方程式是f(n) = f(n-1) + a;那么我们可以这样来看待这个问题:
首先明确,我们的目标是将A上所有N个盘子移动至C。而对于B,我们可以将之看成一个中转站。那么就有下面这三步:
1.把 n-1 号盘子移动到缓冲区(A–>B)
2.把1号从起点移到终点(A–>C)
3.然后把缓冲区的n-1号盘子也移到终点。(B–>C)
3.来看看代码:

 public static void move(char pos1,char pos3) {//move来实现盘子的移动
        System.out.print(pos1+"->"+pos3+" ");
    }
    public static void hanoi(int n,char pos1,char pos2,char pos3) {
        if(n == 1) {
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);//开始位置,中途转接位置,目的位置
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);//开始位置,中途转接位置,目的位置
    }
    public static void main(String[] args) {
        hanoi(1,'A','B','C');
        System.out.println();
        hanoi(2,'A','B','C');
        System.out.println();
        hanoi(3,'A','B','C');
        System.out.println();    
    }
    

运行结果:

在这里插入图片描述
总结:
对递归的理解的要点主要在于放弃!
放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段英文描述的是汉诺塔问题,它是一个经典的问题汉诺塔(Hanoi Tower)又称河内塔,源于印度的一个古老传说。大梵天创造世界时造了三根金刚石柱子,在一根柱子上从下往上按大小顺序放着64片黄金圆盘,大梵天命令婆罗门把圆盘从下面开始按大小顺序依次移到另一根柱子上,且过程中小圆盘必须在大圆盘上面,不允许大圆盘压在小圆盘上面。完成这项任务所需的步数是2的64次方减1,约等于18.4亿步,如果每秒钟完成一步,需要585年左右。 ### 回答2: 婆将这些圆盘从一根柱子上全部移到另一根柱子上,并且规定只能借助第三根柱子。根据传说,当婆婆完成这个任务时,世界就将结束。这个问题看似简单,但是实际上需要一定的推理和图形思维。解决这个问题的难点在于如何将大盘从一根柱子移到另一根柱子,并且保证每个圆盘的大小关系不变,即大盘不能压在小盘上面。最简单的方法就是逐个移动,但是这需要大量的次数和时间。数学家提出的归思想则更加高效,将问题化简为归子问题进行解决。在汉诺塔问题中,每个盘子都可以看做一个节点,将问题转化为移动一个子问题,然后再移动根节点,最后再将子问题移动回去。这样,每次只需移动一个盘子,且规律逐渐显现出来,即移动n个盘子的方法可以转化为移动n-1个盘子+移动根节点+移动n-1个盘子的方法,从而避免了重复计算和无限归。因此,汉诺塔问题不仅锻炼了我们的思维逻辑和数学能力,还展示了归方法在计算中的实际应用。 ### 回答3: 罗门把这些盘子从下面开始按照大小顺序移到另外一根柱子上。 汉诺塔问题是指有三根柱子和一堆不同大小的盘子,盘子从下往上按照逐渐变大的顺序摆放在一根柱子上。游戏的目标是把所有盘子都移动到另一根柱子上,每次只能移动一个盘子,且大盘子不能放在小盘子之上。 这个经典问题涉及到归、分治和数学方面的知识。在解决汉诺塔问题时,使用归可以简化问题,并找到一种通用的解决方法。通过分治思想,将复杂问题分解成小问题来解决,使得问题变得更加容易处理。 在计算汉诺塔问题中,我们可以使用数学公式来计算出移动盘子的最小步骤数。对于一个汉诺塔问题,最少的步骤数可以计算为2的n次方减一,其中n为盘子的数量。 汉诺塔问题是一个非常有趣的问题,它不仅可以用来锻炼我们的思维能力,还能帮助我们理解归和分治思想,同时也为我们提供了一个优秀的数学智力游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值