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。

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

相关文章

  • spring boot 如何指定profile启动

    spring boot 如何指定profile启动

    这篇文章主要介绍了spring boot 如何指定profile启动的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java中二维数组的正确使用方法介绍

    Java中二维数组的正确使用方法介绍

    Java中有一维数组,二维数组以及多维数组,在这篇文章中,将给大家详细介绍一下如何正确使用Java中的二维数组,感兴趣的小伙伴跟着小编一起学习吧
    2023-05-05
  • java中xml和对象之间的互相转换方法

    java中xml和对象之间的互相转换方法

    在java开发中我们经常会遇到Xml与对象互相转换的情况,这篇文章主要给大家介绍了关于java中xml和对象之间的互相转换方法,文中给出了两种解决方法,需要的朋友可以参考下
    2023-06-06
  • Java高并发之CyclicBarrier的用法详解

    Java高并发之CyclicBarrier的用法详解

    CyclicBarrier 是 Java 中的一种同步工具,它可以让多个线程在一个屏障点处等待,直到所有线程都到达该点后,才能继续执行。本文就来和大家聊聊它的用法,需要的可以参考一下
    2023-03-03
  • javaWeb 四大域对象详细介绍

    javaWeb 四大域对象详细介绍

    这篇文章主要介绍了javaWeb 四大域对象详细介绍的相关资料,需要的朋友可以参考下
    2016-11-11
  • springboot中如何通过main方法调用service或dao

    springboot中如何通过main方法调用service或dao

    这篇文章主要介绍了springboot中如何通过main方法调用service或dao,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot实现定时发送邮件的三种方法案例详解

    SpringBoot实现定时发送邮件的三种方法案例详解

    这篇文章主要介绍了SpringBoot三种方法实现定时发送邮件的案例,Spring框架的定时任务调度功能支持配置和注解两种方式Spring Boot在Spring框架的基础上实现了继承,并对其中基于注解方式的定时任务实现了非常好的支持,本文给大家详细讲解,需要的朋友可以参考下
    2023-03-03
  • spring data jpa 查询自定义字段,转换为自定义实体方式

    spring data jpa 查询自定义字段,转换为自定义实体方式

    这篇文章主要介绍了spring data jpa 查询自定义字段,转换为自定义实体方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java使用Alibaba Druid数据库连接池的技术指南

    Java使用Alibaba Druid数据库连接池的技术指南

    Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成,它不仅支持高效的连接管理,还集成了 SQL 监控、日志输出和多种扩展功能,本文将从 Druid 的基本概念出发,结合具体样例,带你全面掌握 Druid 的配置与使用,需要的朋友可以参考下
    2025-03-03
  • SpringBoot在Controller层接收参数的n种姿势(超详细)

    SpringBoot在Controller层接收参数的n种姿势(超详细)

    这篇文章主要介绍了SpringBoot在Controller层接收参数的常用方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01

最新评论