• JavaSE - 递归求解汉诺塔问题


    目录

    1. 汉诺塔的介绍和玩法

    2. 汉诺塔问题的思路

    3. 用递归的代码实现 


    1. 汉诺塔的介绍和玩法

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。

    一共有3根柱子(A、B、C),A柱子由下到上放着由大到小的盘子,我们需要将A柱子上的盘子移到C柱子上,每次只能移动一个盘子,且在任意一次移动中,大盘子都必须处于小盘子下方。

    2. 汉诺塔问题的思路

    若A柱子上只有1个盘子,只需要移动1步:A->C

    若A柱子上有2个盘子,需要移动3步:A->B,A->C,B->C

    此时需要借助B柱子,才能将A柱子的盘子移到C柱子上。

    那么若A柱子上有3个盘子,会怎么移动呢?

    思路:此时,A为起始位置,B为中转位置,C为最终位置。我们需要将A柱子最上面的两个盘子先想办法移到中转位置B柱子上,然后将A柱子最下面的那个盘子移动到C柱子上,最后再将B柱子上面的盘子想办法移动到C柱子上。

    将A柱子最上面的两个盘子想办法移到B柱子上:那对于这两个盘子来说,A是起始位置,B是最终位置,C是中转位置,需要借助C将A上的两个盘子移动到B上。具体移法:要先将A柱子最上面的一个盘子移动到中转位置C上,然后将A柱子上下面那个盘子移到最终位置B柱子上,最后将C柱子上的盘子移到B柱子上。

    将B柱子上面的盘子想办法移动到C柱子上:那对于B柱子上的这两个盘子来说,B为起始位置,A为中转位置,C为最终位置,需要借助A将B上的两个盘子移动到C上。具体移法:要先将B柱子最上面的一个盘子移动到中转位置A上,然后将B柱子上下面那个盘子移到最终位置C柱子上,最后将A柱子上的盘子移到C柱子上。

    所以,最终三个盘子的移动路径是  A->C,A->B,C->B,A->C,B->A,B->C,A->C,需要移动7步

    网上找的动图,更易于理解 

    那么A柱子上有n个盘子时,该怎么移动呢?

    以此类推,先将A柱子上面n-1个盘子想办法移到B柱子上,然后将A柱子上最后一个盘子移动到C柱子上,最终再将B柱子上的n-1个盘子想办法移到C柱子上。 想办法:其实就是柱子上有n-1个盘子,该怎么移动这个问题。

    所以汉诺塔问题用递归实现最好解决。

    3. 用递归的代码实现 

    1. public class HanoiGame {
    2. /*
    3. * 第一个参数用来放给的盘子数,
    4. *第二个参数用来放起始位置
    5. *第三个参数用来放中转位置
    6. *第四个参数用来放最终位置
    7. * */
    8. public static void hanoi(int n,char pose1,char pose2,char pose3){ // 3 'A' 'B' 'C'
    9. if(n == 1){
    10. move(pose1,pose3);//若只有一个盘子,只需从起始位置移到最终位置这1步。
    11. // 这里的pose1不一定等于'A',pose3不一定等于'C';随着递的次数的不一样,对应不同的值。
    12. return;
    13. }
    14. hanoi(n-1,pose1,pose3,pose2);//这n-1个盘子是要借助 C 移动到 B 上的。
    15. //所以 对于这n-1个盘子来说,起始位置是'A',中转位置是'C',最终位置是'B'
    16. move(pose1,pose3);
    17. hanoi(n-1,pose2,pose1,pose3);
    18. }
    19. /*
    20. * 第一个参数用来放起始位置
    21. * 第二个参数用来放最终位置 */
    22. public static void move(char pose4,char pose5){
    23. System.out.println(pose4+" -> "+ pose5);
    24. }
    25. public static void main(String[] args) {
    26. hanoi(3,'A','B','C');
    27. }
    28. }

  • 相关阅读:
    含文档+PPT+源码等]精品spring boot汽车销售管理系统[包运行成功]程序设计源码计算机毕设
    C++ 基础与深度分析 Chapter7 深入I/O(文件与内存操作、流的状态、流的定位、流的同步)
    【k8s】(二)kubernetes1.29.4离线部署之-镜像文件准备
    android 9 adb安装过程学习(一)
    IDT 一款自动化挖掘未授权访问漏洞的信息收集工具
    【C++】详解std::thread
    【mitmproxy手机端App抓包】
    Java中加减乘除的性能和位运算的性能比较
    【图解RabbitMQ-4】Docker安装RabbitMQ详细图文过程
    Linux下IIC驱动编写,介绍IIC子系统框架的使用
  • 原文地址:https://blog.csdn.net/m0_61731585/article/details/126089952