日撸 Java 三百行day27

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day27 Hanoi 塔问题

1.思路

结合下图,a是最开始的柱子,c是目标柱,b是辅助。在步骤1-4 我们把1,2两个圆盘移到辅助盘;在步骤5 我们把最大得盘子移动到目标盘,这是就把3和c柱子作为一个整体。此时!我们要进行第二次递归,b为初始盘,a作为辅助盘,c也是目标盘,把1移动到a盘,2移动到c盘。

不管柱子上又多少盘子,我们只分为一个最大的盘子和n-1个其他盘子,每一批操作下来,最大盘子就在目标盘c上,在其他盘子又分为最大和其他盘子,此时只是初始盘和辅助盘位置发生了变化。这过程都是重复得过程 即可以使用​​递归。
​​​​​​​​​​​​​​​​​​在这里插入图片描述
代码中的递归:可以直接理解为将n-1个盘子从一个盘子移动到另一个辅助盘上,把最大的盘子移动到目标盘。(看递归不能想太细,找到每个子问题的规律即可。不然很容易被绕进去了。我尝试打开debug去一步步执行就被绕晕了。)
(n个盘)
1.在初始时 a是初始盘,b是辅助盘,c是目标盘 此时我们需要将n-1个盘移到b上,最大那个n移动到c盘
2.这是,b是初始盘,a是辅助盘,c是目标盘,此时我们需要将n-2个盘移动到a上,第二大的那个n-1移动到c盘
依次类推,规律就一样,用递归。c一直都是目标盘,但是a和b就是辅助盘和初始盘来回切换耶。递归调出的条件就是当初始盘剩下一个盘子的时候,就跳出来了。

2.代码

package datastructure.tree;

/**
 * @Author: fulisha
 * @Date: 2023-04-12 19:25
 * @desription
 */
public class Hanoi {
    /**
     * Move a number of plates.
     * @param paraSource The source pole.
     * @param paraIntermediary The intermediary pole.
     * @param paraDestination The destination pole.
     * @param paraNumber The number of plates
     */
    public static void hanoi(char paraSource, char paraIntermediary, char paraDestination, int paraNumber) {
        if (paraNumber == 1) {
            System.out.println(paraSource + "->" + paraDestination + " ");
            return;
        }
        hanoi(paraSource, paraDestination, paraIntermediary, paraNumber - 1);
        System.out.println(paraSource + "->" + paraDestination + " ");
        hanoi(paraIntermediary, paraSource, paraDestination, paraNumber - 1);
    }

    public static void main(String args[]) {
        hanoi('a', 'b', 'c', 3);
    }

}

在这里插入图片描述

3.图示

现在放4个进行移动的过程 来进一步的去理解
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值