Java递归来实现汉诺塔游戏,注释详细
作者:钢铁的面条 发布时间:2023-07-05 10:33:52
标签: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。
来源:https://blog.csdn.net/m0_53653818/article/details/121524416
0
投稿
猜你喜欢
- 这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~一、该
- mapper文件使用in("str1","str2")mybatis的xxxMapper.xml文件
- 前言最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共
- 文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成
- 使用ExecutorService来停止线程服务之前的文章中我们提到了ExecutorService可以使用shutdown和shutdow
- 本文实例讲述了Java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:Java文件上传数据上传是客户端向服务器端上传数据,客户端
- Java 日期转换涉及的核心类:Date类、SimpleDateFormat类、Calendar类一、 Date型与long型Date型转换
- 使用RateLimiter通过AOP方式进行限流1、引入依赖<!-- guava 限流 --><dependency>
- 问题描述springcloud项目部署或调试时,占用的内存特别多。当部署到服务器上去后,有可能导致服务器内存占用过多而崩溃。解决方案&nbs
- jol(java object layout)需要的依赖<dependency> <
- 迷宫项目实现设计文档项目介绍:一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一
- 使用前准备Build.gradle文件配置dependencies配置compile 'com.squareup.retrofit2
- 本文实例讲述了Java删除二叉搜索树的任意元素的方法。分享给大家供大家参考,具体如下:一.删除思路分析在删除二叉搜索树的任意元素时,会有三种
- 最近想关闭一个包的日志打印,经过一番研究实际上就一句话的事,一直没成功是因为name写错了。<logger name="pa
- 利用Java连接MySQL做登陆界面,供大家参考,具体内容如下1、首先需要建立一个类,在这里,我命名为newLoginnewLogin类的代
- Java的接口和抽象类深入理解对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。
- 很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同。因此本文就把这些写法总
- Object(四大方法):文章干货满满,耐性看完~~何为Object?首先先来看看官方对Object的介绍:在这里附上Java官方的查阅工具
- 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以
- 服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统