文章目录
- 说明
- 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上,在其他盘子又分为最大和其他盘子,此时只是初始盘和辅助盘位置发生了变化。这过程都是重复得过程 即可以使用递归。
代码中的递归:可以直接理解为将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个进行移动的过程 来进一步的去理解