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。

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

相关文章

  • Java读取文件的简单实现方法

    Java读取文件的简单实现方法

    这篇文章主要介绍了Java读取文件的简单实现方法,通过一个读取txt格式的log文件为例,详细的讲述了Java读取文件的方法及原理,需要的朋友可以参考下
    2014-09-09
  • Java多线程 生产者消费者模型实例详解

    Java多线程 生产者消费者模型实例详解

    这篇文章主要介绍了Java多线程 生产者消费者模型实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java乱码问题解决方法_动力节点Java学院整理

    Java乱码问题解决方法_动力节点Java学院整理

    开发java应用出现乱码是很常见的,毕竟现在unicode的使用还不是很广泛,下面给大家分享Java乱码问题解决方法,感兴趣的朋友一起看看吧
    2017-07-07
  • SpringBoot整合JdbcTemplate的示例代码

    SpringBoot整合JdbcTemplate的示例代码

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了SpringBoot整合JdbcTemplate,需要的朋友可以参考下
    2022-08-08
  • Java中的动态代理原理及实现

    Java中的动态代理原理及实现

    这篇文章主要介绍了Java中的动态代理原理及实现,动态是相对于静态而言,何为静态,即编码时手动编写代理类、委托类,而动态呢,是不编写具体实现类,等到使用时,动态创建一个来实现代理的目的,需要的朋友可以参考下
    2023-12-12
  • Java transient 关键字详解及实例代码

    Java transient 关键字详解及实例代码

    本文章向大家介绍Java transient关键字的使用方法和实例,包括的知识点有transient的作用、transient使用小结、transient使用细节,需要的朋友可以参考一下
    2016-12-12
  • 关于ArrayList的动态扩容机制解读

    关于ArrayList的动态扩容机制解读

    这篇文章主要介绍了关于ArrayList的动态扩容机制解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Spring实战之属性占位符配置器用法示例

    Spring实战之属性占位符配置器用法示例

    这篇文章主要介绍了Spring实战之属性占位符配置器用法,结合实例形式分析了spring属性占位符配置器的具体配置及使用技巧,需要的朋友可以参考下
    2019-12-12
  • Java 中的 xx ≠ null 是什么新语法

    Java 中的 xx ≠ null 是什么新语法

    Java中null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。本文给大家分享Java 中的 xx ≠ null 是什么新语法,感兴趣的朋友一起看看吧
    2021-06-06
  • Elasticsearch查询之Term Query示例解析

    Elasticsearch查询之Term Query示例解析

    这篇文章主要为大家介绍了Elasticsearch查询之Term Query示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论