日撸 Java 三百行day27

文章目录

  • 说明
  • day27 Hanoi 塔问题
    • 1.思路
    • 2.代码
    • 3.图示

说明

闵老师的文章链接: 日撸 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上,在其他盘子又分为最大和其他盘子,此时只是初始盘和辅助盘位置发生了变化。这过程都是重复得过程 即可以使用​​递归。
​​​​​​​​​​​​​​​​​​日撸 Java 三百行day27_第1张图片
代码中的递归:可以直接理解为将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);
    }

}

日撸 Java 三百行day27_第2张图片

3.图示

现在放4个进行移动的过程 来进一步的去理解

日撸 Java 三百行day27_第3张图片

你可能感兴趣的:(java,算法,数据结构,开发语言)