JavaSE递归求解汉诺塔问题的思路与方法

 更新时间:2022年08月03日 11:26:46   作者:渡上舟(每天都要坚持学习鸭)  
递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它,下面这篇文章主要给给大家介绍了关于JavaSE递归求解汉诺塔问题的思路与方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

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. 用递归的代码实现 

public class HanoiGame {
/*
* 第一个参数用来放给的盘子数,
 *第二个参数用来放起始位置
 *第三个参数用来放中转位置
 *第四个参数用来放最终位置
 * */
    public static void hanoi(int n,char pose1,char pose2,char pose3){ // 3 'A' 'B' 'C'
        if(n == 1){
            move(pose1,pose3);//若只有一个盘子,只需从起始位置移到最终位置这1步。
            // 这里的pose1不一定等于'A',pose3不一定等于'C';随着递的次数的不一样,对应不同的值。
            return;
        }
        hanoi(n-1,pose1,pose3,pose2);//这n-1个盘子是要借助 C 移动到 B 上的。
               //所以 对于这n-1个盘子来说,起始位置是'A',中转位置是'C',最终位置是'B'
        move(pose1,pose3);
        hanoi(n-1,pose2,pose1,pose3);
 
    }
    /*
    * 第一个参数用来放起始位置
    * 第二个参数用来放最终位置 */
    public static void move(char pose4,char pose5){
        System.out.println(pose4+" -> "+ pose5);
 
    }
    public static void main(String[] args) {
        hanoi(3,'A','B','C');
    }
}

总结

到此这篇关于JavaSE递归求解汉诺塔问题的思路与方法的文章就介绍到这了,更多相关JavaSE递归求解汉诺塔内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中super关键字详解

    Java中super关键字详解

    这篇文章主要为大家详细介绍了Java中super关键字,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Java properties 和 yml 的区别解析

    Java properties 和 yml 的区别解析

    properties和yml都是Spring Boot支持的两种配置文件,它们可以看做Spring Boot在不同时期的两种“产品”,这篇文章主要介绍了Java properties 和 yml 的区别,需要的朋友可以参考下
    2023-02-02
  • 剖析Java中HashMap数据结构的源码及其性能优化

    剖析Java中HashMap数据结构的源码及其性能优化

    这篇文章主要介绍了Java中HashMap数据结构的源码及其性能优化,文中以Java 8后HashMap的性能提升来讨论了HashMap的一些优化点,需要的朋友可以参考下
    2016-05-05
  • JAVA实现红包分发的示例代码

    JAVA实现红包分发的示例代码

    这篇文章主要介绍了JAVA实现红包分发的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Spring Security LDAP实现身份验证的项目实践

    Spring Security LDAP实现身份验证的项目实践

    在本文中,我们涵盖了“使用 Spring Boot 的 Spring Security LDAP 身份验证示例”的所有理论和示例部分,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • SpringMVC的Body参数拦截的问题

    SpringMVC的Body参数拦截的问题

    SpringMVC对出参和入参有非常友好的拓展支持,方便你对数据的输入和输出有更大的执行权,我们如何通过SpringMVC定义的结果做一系列处理呢,需要的朋友可以参考下
    2018-06-06
  • SpringBoot整合Swagger2实例方法

    SpringBoot整合Swagger2实例方法

    在本篇文章里小编给大家整合了关于SpringBoot整合Swagger2的相关知识点内容,有兴趣的朋友们学习下。
    2019-06-06
  • 关于feign.codec.DecodeException异常的解决方案

    关于feign.codec.DecodeException异常的解决方案

    这篇文章主要介绍了关于feign.codec.DecodeException异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解决在IDEA中创建多级package的问题

    解决在IDEA中创建多级package的问题

    这篇文章主要介绍了解决在IDEA中创建多级package的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Sequelize 常用操作详解及实例代码

    Sequelize 常用操作详解及实例代码

    这篇文章主要介绍了Sequelize 常用操作详解及实例代码的相关资料,希望能帮助到大家,需要的朋友可以参考下
    2016-11-11

最新评论