【Java】汉诺塔

news2024/11/24 9:25:56

 汉诺塔

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


  汉诺塔规则

  •  disk表示圆盘数
  • 一次只能移动一个圆盘
  • 小圆盘只能在大圆盘的上方
  • A 、B 、C分别表示圆柱
  • A为起始圆柱、B为中转圆柱、C为终止圆柱

disk = 1 时:

移动次数为:2^1 - 1

只需要将绿色圆盘 A->C 直接移过去;

A->C


disk = 2 时:

移动次数为:2^2 - 1,一次只能移动一个圆盘

  1. 黄色圆盘 A->B
  2. 绿色圆盘 A->C
  3. 黄色圆盘B->C

A->B  A->C  B->C


disk = 3 时:

移动次数为:2^3 - 1,一次只能移动一个圆盘

  1. 粉色圆盘A->C
  2. 黄色圆盘A->B
  3. 粉色圆盘C->B
  4. 绿色圆盘A->C
  5. 粉色圆盘B->A
  6. 黄色圆盘B->C
  7. 粉色圆盘A->C

A->C  A->B  C->B  A->C  B->A  B->C  A->C


递归分析

  1. 先看desk = 3 个圆盘时,我们是先将圆柱A上面的2个圆盘(3 - 1),借助圆柱C最终移动到圆柱B上;
  2. 此时圆柱A上就只剩1个圆盘,就可以直接将圆盘从圆柱A移动到圆柱C;


  1. desk = 2个圆盘,先将圆柱B上面的那1个圆盘(2 - 1),最终直接从圆柱B移动到圆柱A上;
  2. 此时圆柱B上就只剩1个圆盘,就可以直接从圆柱B移动到圆柱C上;


  1. 只剩最后1个圆盘了,则是直接从圆柱A上移动到圆柱C上;


 disk = n 时:

移动次数为:2^n - 1,一次只能移动一个圆盘

错误递归分析

  1.  当desk = n个圆盘时,需要将圆柱A上面的n-1个圆盘,借助圆柱C最终移动到圆柱B上;
  2. 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;

  1.  desk = n 时,先将圆柱B上面的n-1个圆盘,借助圆柱C最终移到圆柱A上;
  2. 此时圆柱A上有n-1个圆盘,递归以上步骤;


  1. 当 desk = n-1时,需要将圆柱A上面的(n-1) - 1个圆盘,借助圆柱C移到圆柱B上(这里已经在开始和desk = n 的情况一样);
  2. 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;

  1. desk = n-1时,先将圆柱B上面的(n-1) - 1个圆盘,借助圆柱C最终移到圆柱A上;
  2. 此时圆柱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');
    }
}

 正确递归分析

  1.  当desk = n个圆盘时,需要将圆柱A上面的n-1个圆盘,借助圆柱C最终移动到圆柱B上;
  2. 此时圆柱A上就只剩1个圆盘,则直接从圆柱A移动到圆柱C;
  3. 圆柱B上的n-1个圆盘,借助圆柱A最终移动到圆柱C上;
  4. 此时圆柱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');
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这5个老年人技巧,让你的微信操作起来更方便

目录 一、便捷登录验证 二、快速开启关怀模式 三、语音与消息撤回 四、快速打开名片二维码 五、语音收藏 六、总结 今天小编给大家分享5个老年人技巧,一起来看看吧!说不定也能让你的微信操作起来更方便呢! 一、便捷登录验证 在微信中&a…

GAMP源码阅读:PPP中的模型改正:对流层延迟、电离层延迟

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、对流层延迟改正1、原理2、model_trop():对流层改正入口函数3、tropmodel():Saastamoinen 模型改正计算延迟1. Saastam…

redis数据库缓存服务器

redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用:加快访问速度,缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作,要么全部执行&#xff0…

模拟与高精度

文章目录 模拟[NOIP2003 普及组] 乒乓球[NOIP2015 普及组] 扫雷游戏[NOIP2016 提高组] 玩具谜题 高精度P1601 AB Problem(高精)P1303 A*B Problem[NOIP1998 普及组] 阶乘之和 #mermaid-svg-LVtcjL47i4zwUnwI {font-family:"trebuchet ms",verd…

面试梳理-Redis01

目录 开场白-追命3连 使用场景 01缓存穿透场景与方案 02布隆过滤器 03缓存击穿场景与方案 04缓存雪崩场景与方案 开场白-追命3连 看你项目中有说用到Redis,都是哪些场景使用了Redis呢? 如果发生了缓存穿透、击穿、雪崩如何应对呢?缓存…

程序员笔记本电脑选 windows 还是 MAC

计算机选择是每个进入 IT 行业同学的第一个重要选择,那么你是怎么选择的呢? 选择操作系统(Windows还是macOS)取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点,下面将分别讨论它们,以帮助…

一文搞懂设计模式之七大原则

大家好,我是晴天。在接下来的一个多月里,我将跟大家一起学习设计模式的一些基础知识和基本应用。不要问我为什么突然想起来写一个设计模式系列的文章,问就是:爱过。。。 问题引出 作为程序猿的我们,隔三岔五的就会因为…

上班族必备:制作电子宣传册的网站

​对于上班族来说,制作电子宣传册是一项非常重要的技能。因为宣传册是展示公司形象、产品特点、服务优势的重要工具,也是与客户沟通交流的重要手段。那么,如何制作一份高质量的电子宣传册呢?今天就为大家推荐几个制作电子宣传册的…

hackergame2023菜菜WP

文章目录 总结Hackergame2023更深更暗组委会模拟器猫咪小测标题HTTP集邮册Docker for everyone惜字如金 2.0Git? Git!高频率星球低带宽星球小型大语言模型星球旅行日记3.0JSON ⊂ YAML? 总结 最近看到科大在举办CTF比赛,刚好我学校也有可以参加,就玩了…

SQL左连接实战案例

要求:用表df1和表df2的数据,得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…

【LeetCode刷题-链表】--328.奇偶链表

328.奇偶链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ clas…

【漏洞复现】Apache_Tomcat_PUT方法任意写文件(CVE-2017-12615)

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证工具扫描验证POC 1.6、修复建议 说明内容漏洞编号CVE-2017-12615漏洞名称Tomcat_PU…

python实现多帧torch.istft的结果可以由多个单帧torch.istft的结果重叠拼接得到

🔥 🔥 🔥 背景:做某个项目(由于项目处于保密状态,只提供思路),需要求多帧的istft。但是手头只有单帧的istft代码(当然不能python代码,不然就直接调包)。 📣 …

Quartus II 13.0波形仿真(解决无法产生仿真波形问题)

目录 前言 新建工程 创建Verilog文件,写代码 波形仿真(解决没有输出波问题) 前言 这么说把Quartus II 13.0是我目前来讲见过最恶心的软件,总是一大堆麻烦事,稍微哪里没弄好就后面全都出问题。很多人在写完Verilog代…

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…

配件管理系统软件哪家好?企业配件管理要怎么做?

在许多企业中&#xff0c;生产数据的记录仍然依赖于纸质流转卡&#xff0c;这种传统的方式带来了许多问题。手工填写导致的字迹潦草、数据不准确或不完全、统计困难等都是无法避免的问题。为了解决这些问题&#xff0c;我们推荐使用一款智能配件管理系统&#xff0c;帮助企业从…

Springboot搭建微服务案例之Eureka注册中心

一、父工程依赖管理 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

常见通信协议

博客内容&#xff1a;UART,IIC,SPI 文章目录 一、UART二、IIC三、SPI总结 一、UART 一种串行通信接口协议&#xff0c;用于在计算机系统和外部设备之间进行数据传输。UART可以支持异步和同步两种通信方式。在异步通信方式下&#xff0c;数据传输不需要在发送方和接收方之间进行…

自学SLAM(7)非线性优化实践:曲线拟合问题(使用ceres库和SLAM常用的g2o库)

前言 本次文章针对的是第四个视屏中的实践问题 肯定会有部分方法没有说到&#xff0c;比如高斯牛顿法&#xff0c;后面我会把此次视屏对应的作业写好&#xff0c;然后补充到此次博客&#xff01;&#xff01; 文章目录 前言1.曲线拟合题目&#xff1a;2.非线性最小二乘2.1 黄金…

网络基础扫盲-初识网络

博客内容&#xff1a;初识网络 文章目录 一、OSI七层网络模型二、TCP/IP四层模型1、MAC地址与IP地址 前言 在以前网络不够发之前&#xff0c;各个实验室进行一些研究时需要进行数据的交流&#xff0c;但是那时车马很慢&#xff0c;一生只够跑几次&#xff0c;所以就有人研究了网…