【Java】汉诺塔
汉诺塔
汉诺塔(Tower of Hanoi)(河内塔):把圆盘从下面开始按大小顺序重新摆放到另一根柱子上,并且小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
汉诺塔规则
- disk表示圆盘数
- 一次只能移动一个圆盘
- 小圆盘只能在大圆盘的上方
- A 、B 、C分别表示圆柱
- A为起始圆柱、B为中转圆柱、C为终止圆柱
disk = 1 时:
移动次数为:2^1 - 1
只需要将绿色圆盘从 A->C 直接移过去;
A->C
disk = 2 时:
移动次数为:2^2 - 1,一次只能移动一个圆盘
- 黄色圆盘从 A->B
- 绿色圆盘从 A->C
- 黄色圆盘从 B->C
A->B A->C B->C
disk = 3 时:
移动次数为:2^3 - 1,一次只能移动一个圆盘
- 粉色圆盘从 A->C
- 黄色圆盘从 A->B
- 粉色圆盘从 C->B
- 绿色圆盘从 A->C
- 粉色圆盘从 B->A
- 黄色圆盘从 B->C
- 粉色圆盘从 A->C
A->C A->B C->B A->C B->A B->C A->C
递归分析
- 先看desk = 3 个圆盘时,我们是先将圆柱A上面的2个圆盘(3 - 1),借助圆柱C最终移动到圆柱B上;
- 此时圆柱A上就只剩1个圆盘,就可以直接将圆盘从圆柱A移动到圆柱C;
- desk = 2个圆盘,先将圆柱B上面的那1个圆盘(2 - 1),最终直接从圆柱B移动到圆柱A上;
- 此时圆柱B上就只剩1个圆盘,就可以直接从圆柱B移动到圆柱C上;
- 只剩最后1个圆盘了,则是直接从圆柱A上移动到圆柱C上;
disk = n 时:
移动次数为:2^n - 1,一次只能移动一个圆盘
错误递归分析
- 当desk = n个圆盘时,需要将圆柱A上面的n-1个圆盘,借助圆柱C最终移动到圆柱B上;
- 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;
- desk = n 时,先将圆柱B上面的n-1个圆盘,借助圆柱C最终移到圆柱A上;
- 此时圆柱A上有n-1个圆盘,递归以上步骤;
- 当 desk = n-1时,需要将圆柱A上面的(n-1) - 1个圆盘,借助圆柱C移到圆柱B上(这里已经在开始和desk = n 的情况一样);
- 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;
- desk = n-1时,先将圆柱B上面的(n-1) - 1个圆盘,借助圆柱C最终移到圆柱A上;
- 此时圆柱A上有(n-1) - 1个圆盘,递归以上步骤;
错误代码分析
public class TowerOfHanoi {public static void hanoi(int n, char posA, char posB, char posC) {// hanoi(圆盘个数,参数1,参数2,参数3)// 参数1表示起始位置、参数2表示中转位置、参数3表示终止位置if(n == 1) {move(posA, posC);return; // 递归一定要return}// 这一步就是将 圆柱A 上的 n-1个 圆盘// 借助圆柱C 移动到 圆柱B上hanoi(n-1, posA, posC, posB);// 将圆柱A上剩下的一个移到圆柱C上move(posA, posC);// 将 圆柱B 上的所有圆盘 借助圆柱C 移到圆柱A上hanoi(n-1, posB, posC, posA); // 这里是错的}public static void move(char pos1, char pos2) {System.out.println(pos1 + "->" + pos2);}public static void main(String[] args) {hanoi(3, 'A', 'B', 'C');}
}
正确递归分析
- 当desk = n个圆盘时,需要将圆柱A上面的n-1个圆盘,借助圆柱C最终移动到圆柱B上;
- 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;
- 将圆柱B上的n-1个圆盘,借助圆柱A最终移动到圆柱C上;
- 此时圆柱B上就只剩一个圆盘,则直接从圆柱B移动到圆柱C;
正确代码分析
public class TowerOfHanoi {public static void hanoi(int n, char posA, char posB, char posC) {// hanoi(圆盘个数,参数1,参数2,参数3)// 参数1表示起始位置、参数2表示中转位置、参数3表示终止位置if(n == 1) {move(posA, posC);return; // 递归一定要return}// 这一步就是将 圆柱A 上的 n-1个 圆盘// 借助圆柱C 移动到 圆柱B上hanoi(n-1, posA, posC, posB);// 将圆柱A上剩下的一个移到圆柱C上move(posA, posC);hanoi(n-1, posB, posA, posC);}public static void move(char pos1, char pos2) {System.out.println(pos1 + "->" + pos2);}public static void main(String[] args) {hanoi(3, 'A', 'B', 'C');}
}
相关文章:

【Java】汉诺塔
汉诺塔 汉诺塔(Tower of Hanoi)(河内塔):把圆盘从下面开始按大小顺序重新摆放到另一根柱子上,并且小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 汉诺塔规则 disk表示圆盘数一次只…...

Java实现对Html文本的处理
1.引入jsoup <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version> </dependency> 2. html示例 示例代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…...

Vue项目创建与启动(2023超详细的图文教程)
目录 一、下载node.js 二、下载vue-cli与webpack插件 三、项目初始化(项目配置详细信息) 四、项目启动 五、Vue项目工程结构(扩展知识) 一、下载node.js 1.检测是否已经安装过node.js 打开控制台,输入 npm -v如果有会显示对应版本 如果没有会显示…...

EtherCAT主站读取从站EEPROM抓包分析
0 工具准备 1.EtherCAT主站 2.EtherCAT从站(本文使用步进电机驱动器) 3.Wireshark1 抓包分析 1.1 报文总览 本文让主站去读取从站1字地址为0的EEPROM数据内容,主站读取从站EEPROM数据内容使用Wireshark抓包如下: 1.2 EEPROM读…...

Elasticsearch 8.X 如何生成 TB 级的测试数据 ?
1、实战问题 我只想插入大量的测试数据,不是想测试性能,有没有自动办法生成TB级别的测试数据?有工具?还是说有测试数据集之类的东西?——问题来源于 Elasticsearch 中文社区https://elasticsearch.cn/question/13129 2…...

汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
目录 1.问题现象 2.数据流分析 3.代码分析 3.1 AllocDAQ 3.2 AllocOdt 3.3 AllocOdtEntry 4.根因分析及解决方法 4.1 根因分析 4.2 解决方案 1.问题现象 在手撸XCP代码时, DAQ的实现是一大头痛的事情。最初单周期实现还好一点,特别是…...

Flink SQL时间属性和窗口介绍
(1)概述 时间属性(time attributes),其实就是每个表模式结构(schema)的一部分。它可以在创建表的 DDL 里直接定义为一个字段,也可以在 DataStream 转换成表时定义。 一旦定义了时间…...

Tomcat免安装版修改标题名称和进程
tomcat免安装版启动后闪退问题 问题描述 在官网下载的tomcat免安装版的你安装完环境后发现启动闪退,tomcat启动依赖环境是JDK,所以需要tomcat对应版本的JDK支持。 tomcat8官网下载地址:https://tomcat.apache.org/ JDK环境官网下载地址&…...
vim搜索、替换tab
bibtex 中的缩进可能不一致,强迫症犯了想将: 缩进空格改 tab;行首的多个 tab 改为单个 参考 [1],空格换 tab 可以: :set noexpandtab :%retab!行首的多个 tab 换单个: :%s/^\t\/\t/gReferences Replac…...

一文读懂ARM安全性架构和可信系统构建要素
一文读懂ARM安全性架构和可信系统构建要素 所谓可信系统(trusted system),即能够用于保护密码和加密密钥等资产(assets)免受一系列的可信攻击,防止其被复制、损坏或不可用(unavailable…...

Voice vlan、ICMP、单臂路由、mux-vlan
目录 一,Voice VLAN Voice vlan配置命令 一,问:已知网络中一台服务器的IP地址,如何找到这太服务器在哪台交换机的哪个接口上编辑 思路: 二,ICMP协议 三,ICMP案例分析编辑 四…...
TCP IP 网络编程(七) 理解select和epoll的使用
文章目录 理解select函数select函数的功能和调用顺序设置文件描述符设置监视范围及超时select函数调用示例 优于select的epoll基于select的I/O复用速度慢实现epoll时必要的函数和结构体epoll_createepoll_ctlepoll_wait基于epoll的服务器端 边缘触发和水平触发 理解select函数 …...
Linux accept和FD_xxx的使用
Linux socket accept功能的作用是在服务器端等待并接受客户端的连接请求。当有客户端尝试连接服务器时,服务器调用accept函数来接受该连接请求,并创建一个新的socket来与该客户端进行通信。 具体来说,accept函数被动监听客户端的三次握手连接…...

树结构及其算法-二叉运算树
目录 树结构及其算法-二叉运算树 C代码 树结构及其算法-二叉运算树 二叉树的应用实际上相当广泛,例如表达式之间的转换。可以把中序表达式按运算符优先级的顺序建成一棵二叉运算树(Binary Expression Tree,或称为二叉表达式树)…...
vue的rules验证失效,部分可以部分又失效的原因
vue的rules验证失效,部分可以部分又失效的原因 很多百度都有,但是我这里遇到了一个特别的,那就是prop没有写全,导致验证某一个失效 例子: 正常写法 el-form-item....多个省略<el-form-item label"胶币" prop"cost"><el-input v-model"form.…...
c#字符串转整数类型
将字符串转换为整数类型。为了方便,C#提供了一个内置的方法TryParse来实现这个功能 字符串(String):表示一串字符的数据类型。整数(Integer):表示不带小数点的数字。解析(Parsing&a…...

【LeetCode】118. 杨辉三角
118. 杨辉三角 难度:简单 题目 给定一个非负整数 *numRows,*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例…...

【Vue.js】Vue3全局配置Axios并解决跨域请求问题
系列文章目录 文章目录 系列文章目录背景一、部署Axios1. npm 安装 axios2. 创建 request.js,创建axios实例3. 在main.js中全局注册axios4. 在页面中使用axios 二、后端解决跨域请求问题方法一 解决单Contoller跨域访问方法二 全局解决跨域问题 背景 对于前后端分离…...
【车载开发系列】CRC循环冗余校验码原理
【车载开发系列】CRC循环冗余校验码原理 CRC循环冗余校验码原理 【车载开发系列】CRC循环冗余校验码原理一. CRC算法原理二. 生成多项式三. 多项式与其对应代码四. CRC码校验原理1)发送端2)接收端 五. CRC码原理方法1)发送端生成CRC码方法2&a…...

数据库实验:SQL的数据更新
目录 实验目的实验内容实验要求实验步骤实验过程总结 再次书接上文,sql基础的增删改查 实验目的 (1) 掌握DBMS的数据查询功能 (2) 掌握SQL语言的数据更新功能 实验内容 (1) update 语句用于对表进行更新 (2) delete 语句用于对表进行删除 (3) insert 语句用于对表…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...