Java递归来实现汉诺塔游戏,注释详细

 更新时间:2021年11月25日 17:17:39   作者:钢铁的面条  
这篇文章介绍了Java递归来实现汉诺塔游戏的方法,文中的代码注释介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

我们很容易能想到,可以用递归来实现汉诺塔游戏。因为要将n(n>1)个盘子从“源”柱子移到“目标”柱子,我们要先把n-1个盘子从“源”柱子移到“辅助”柱子上,然后把最底下那一个盘子移到目标柱子上,最后把“辅助柱”上的n-1个盘子移动到目标柱子上。n==1时直接移到目标柱上,也是递归的出口。

有了以上思路的铺垫,就可以开始实现代码了。

public class HanoiDemo {
    public static int hanoiCalledCount = 0;//成员变量记录操作次数
 
    //汉诺塔游戏是一种二路递归
    public static void main(String[] args) {
        hanoi(3,"A","B","C");
        System.out.println("执行"+hanoiCalledCount+"步");
    }
 
    public static void hanoi(int n,String source,String target,String assist){
        if(n<=0){
            System.out.println("n要大于零");
        }
        if(n==1){//递归的出口,n==1时直接移到目标柱上
            System.out.printf("把一个盘子从%s柱子上移动到%s柱子上\n",source,target);
            hanoiCalledCount++;//计数器加一
        }else{
            //先把n-1个盘子从“源”柱子移到“辅助”柱子上
            hanoi(n-1,source,assist,target);
            //把最底下那一个盘子移到目标柱子上
            System.out.printf("把一个盘子从%s柱子上移动到%s柱子上\n",source,target);
            hanoiCalledCount++;//计数器加一
            //把“辅助柱”上的n-1个盘子移动到目标柱子上
            hanoi(n-1,assist,target,source);
        }
    }
}

运行结果如下,大家可以尝试验证一下是否正确。

当n==2时,要操作3次

当n==3时,要操作7次

当n==4时,要操作15次

相信大家已经猜出规律了,操作次数==n^2-1

可见,随着盘子个数n的增加,操作次数以n^2增加,所以,自己玩汉诺塔游戏的是时候建议数字不要超过20。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringData Repository Bean方法定义规范代码实例

    SpringData Repository Bean方法定义规范代码实例

    这篇文章主要介绍了SpringData Repository Bean方法定义规范代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java10下编译lombok注解代码分享

    java10下编译lombok注解代码分享

    这篇文章给大家分享了java10下编译lombok注解的代码,有兴趣的朋友可以测试以下,学习参考下吧。
    2018-04-04
  • servlet之cookie简介_动力节点Java学院整理

    servlet之cookie简介_动力节点Java学院整理

    Cookie技术诞生以来,它就成了广大网络用户和Web开发人员争论的一个焦点。下面这篇文章主要给大家介绍了关于servlet之cookie简介的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • java 获取字节码文件的几种方法总结

    java 获取字节码文件的几种方法总结

    这篇文章主要介绍了java 获取字节码文件的几种方法总结的相关资料,这里总结了三种方法帮助大家实现该功能,需要的朋友可以参考下
    2017-08-08
  • 小伙熬夜用Java重现经典超级马里奥代码实例

    小伙熬夜用Java重现经典超级马里奥代码实例

    这篇文章主要介绍了Java重现经典超级马里奥,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详谈Java几种线程池类型介绍及使用方法

    详谈Java几种线程池类型介绍及使用方法

    下面小编就为大家带来一篇详谈Java几种线程池类型介绍及使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • mybatis单笔批量保存实体数据的方法

    mybatis单笔批量保存实体数据的方法

    这篇文章主要介绍了mybatis单笔批量保存实体数据的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 实例详解Java中ThreadLocal内存泄露

    实例详解Java中ThreadLocal内存泄露

    这一篇文章我们来分析一个Java中ThreadLocal内存泄露的案例。分析问题的过程比结果更重要,理论结合实际才能彻底分析出内存泄漏的原因。
    2016-08-08
  • Java正则表达式之split()方法实例详解

    Java正则表达式之split()方法实例详解

    这篇文章主要介绍了Java正则表达式之split()方法,结合实例形式较为详细的分析了split方法的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-03-03
  • springcloud pom.xml完整配置详解

    springcloud pom.xml完整配置详解

    这篇文章主要介绍了springcloud pom.xml完整配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论