汉诺塔问题

作者本文的目标是利用递归求解汉诺塔的具体步骤

目录

  • 汉诺塔是什么
  • 游戏思路
    • 1.最简单的情况——==一个圆盘==
    • 依次类推,增加盘子个数
    • 2.两个圆盘
    • 3.三个圆盘
    • ==解释递归过程==
  • 完整代码

汉诺塔是什么

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

在这里插入图片描述

游戏思路

使用递归法,从复杂情况中找到最简单最特殊的情况,这就是递归结束的条件。
分析游戏,本游戏最核心的要求就是在小圆盘上不能放大圆盘
我们将三根柱子分别命名为A,B,C。

public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入圆盘个数:");
        int n=sc.nextInt();
        System.out.println("过程为");
        hanoi(n,'a','b','c');
    }

在开始前,我们要输入圆盘个数,以及各个柱子的名称。

1.最简单的情况——一个圆盘

分析游戏,最简单的情况就是只有一个圆盘
只需将第A柱子上的圆盘移动到C柱子上就可。

在这里插入图片描述
只需要一步,从A柱移动到C柱上。
在这里插入图片描述
该过程简述为 A->C
此时我们可以写出递归的最特殊的情况,n==1;程序代码如下

//这里pos代表柱子
 public static void move(char pos1,char pos2){
        
        System.out.print(pos1 +"->"+ pos2+" ");
    }

运行程序
在这里插入图片描述

依次类推,增加盘子个数

2.两个圆盘

初始情况如下图,A柱上放有两个圆盘

在这里插入图片描述

此时就需要借助B柱来进行移动。
1.先将A柱上的圆盘1移动到B柱上
2.再将A柱上的圆盘2移动到C柱上
3.将B柱上的圆盘1移动到C柱上

第一步
在这里插入图片描述
第二步
在这里插入图片描述
第三步
在这里插入图片描述
该过程简述为 A->B A->C B->C
程序如下

public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }

在这里插入图片描述

3.三个圆盘

在进行三个圆盘的移动时,我们总结1个圆盘和2个圆盘的过程,再加上递归的思想,我们的目的是先要将最大的盘也就是图中的盘3先放到C柱上。此时我们的步骤如下
1.先通过C柱将A柱上的1,2盘移动到B柱上
2.将A柱上的3盘移动到C柱上
3.利用A柱,再将B柱上的盘1,2移动到C柱上

在这里插入图片描述
第一步
在这里插入图片描述
在这里插入图片描述
简述过程 A->C A->B C->B
第二步
在这里插入图片描述
简述过程 A->C
第三步
在这里插入图片描述
在这里插入图片描述
简述过程
B->A B->C A->C

在这里插入图片描述

解释递归过程

递归代码如下

public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos2){
//        System.out.println("过程为");
        System.out.print(pos1 +"->"+ pos2+" ");
    }

声明,我们这里输入如下
hanoi(n,'a','b','c');
pos1->a
pos2->b
pos3->c
当我们输入n=3时,进入递归中,首先n!=1,所以执行hanoi(n-1,pos1,pos3,pos2);这一步,传入数据为hanoi(1,a,c,b );
这时我们进入另一次递归,也就是从头开始
在这里插入图片描述
此时传入的是hanoi(2,a,c,b);
这时n还是不等于1,则再次进入递归
在这里插入图片描述
这里注意每次形参的位置发生变化
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
进入第二次递归后,此时传入的是hanoi(2,a,c,b);n!=1,进入hanoi(1,a,b,c)
此时n==1,接收到move(a,c)打印a->c.这时第二次递归结束,返回第一次递归中红点这一步,因为我们上一步传入的是hanoi(2,a,c,b);
此时接收到move(a,b),这时打印出a->b.

在这里插入图片描述
这一步完成之后,进入红点下一步的hanoi(n-1,pos2,pos1,pos3);
这以后注意,n的值为2,再次进入递归,以此类推。

完整代码

public class test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入圆盘个数:");
        int n=sc.nextInt();
        System.out.println("过程为");
        hanoi(n,'a','b','c');
    }
    public static void hanoi(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hanoi(n-1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos3){
//        System.out.println("过程为");
        System.out.print(pos1 +"->"+ pos3+" ");
    }
}

码字不易,感谢观看
如果对你有帮助的话,记得点赞👍评论+关注吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)

之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案,并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…

学习笔记---更进一步的双向链表专题~~

目录 1. 双向链表的结构🦊 2. 实现双向链表🐝 2.1 要实现的目标🎯 2.2 创建初始化🦋 2.2.1 List.h 2.2.2 List.c 2.2.3 test.c 2.2.4 代码测试运行 2.3 尾插打印头插🪼 思路分析 2.3.1 List.h 2.3.2 List.…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

Ceph入门到精通-bluestore IO流程及导入导出

bluestore 直接管理裸设备,实现在用户态下使用linux aio直接对裸设备进行I/O操作 写IO流程: 一个I/O在bluestore里经历了多个线程和队列才最终完成,对于非WAL的写,比如对齐写、写到新的blob里等,I/O先写到块设备上&am…

0003net程序设计-net旅游景点推荐系统

文章目录 摘 要目录系统设计开发环境 摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&#…

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

9月20日,以“多模态 多引擎 超融合 新生态”为主题的亚信科技AntDB数据库8.0产品发布会成功举办,从技术和生态两个角度全方位展示了AntDB数据库第8次大型能力升级和生态建设成果。浙江移动、用友、麒麟软件、华录高诚、金云智联等行业伙伴及业界专家共同…

Goland连接服务器/虚拟机远程编译开发

创建SSH连接 SSH用于与远程服务器建立连接 Settings -> Tools -> SSH Configurations 添加新的ssh连接,Host为ip地址,Username为用户名,认证方式这里选择密码验证 全部填完后可以点击Test Connection测试连接是否成功 创建Deployment…

nginx 转发数据流文件

1.问题描述 后端服务,从数据库中查询日志,并生成表格文件返回静态文件。当数据量几兆时,返回正常,但是超过几十兆,几百兆,就会超过网关的连接超时时间30秒。 时序图 这里面主要花费时间的地方在&#xff…

SPSS单样本t检验

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

在excel中如何打出上标、下标

例如,想把A2的2变为下标。 在单元中输入内容: 选中2: 右键单击,然后点击“设置单元格格式”: 在特殊效果的下面勾选“下标”,然后点击下面的“确定”按钮: 就将2变为下标了:…

线扫相机DALSA--采集卡Base模式设置

采集卡默认加载“1 X Full Camera Link”固件,Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标,选择“打开文件所在的位置”,找到并打开SciDalsaConfig的Demo,如上图所示: 左键单击“获取相机”&a…

【错误解决方案】ModuleNotFoundError: No module named ‘xgboost‘

1. 错误提示 在尝试导入名为xgboost的模块时出现了ModuleNotFoundError。 错误提示:ModuleNotFoundError: No module named xgboost 这个错误通常意味着Python环境中没有安装你试图导入的模块。 2. 解决方案 安装xgboost模块即可解决上述问题。 可以通过Python…

对于SOCKET套接字问题的若干认识

1. 首先大家应该知道Socket 编程吧 Socket套接字 分为 应用层套接字 数据链路层套接字(也就是原始socket) 1.流套接字(SOCK_STREAM) 流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接…

智能运维第一步:HDD磁盘故障预测

当今数字化时代,信息技术扮演着企业和组织运营的关键角色。然而,随着IT环境不断复杂化和数据量激增,传统的运维管理方法已经无法满足日益增长的需求。为应对这一挑战,智能运维(Artificial intelligence for IT operati…

【Linux】常见指令以及具体其使用场景

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,随着博主的学习,博主掌握的技能也越来越多,今天又根据最近的学习开设一个新的专栏——Linux,相信Linux操作系…

Redis代替session实现用户验证

一、Redis代替session实现用户验证。 下图是session的实现登录需要实现的代码模块,虽然可以实现完整功能,但是仍然存在一些问题。 在以往使用session当作用户验证的过程中,会有session共享的问题,每次承担请求的tomcat是不一样…

okhttp post请求 header post参数加密遇到的两个问题

如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在…

Python小试牛刀:GUI(图形界面)实现计算器界面

Python GUI 是指 Python 图形用户界面库,它们可以帮助开发者创建在计算机上运行的图形用户界面(GUI)。下面是一些常用的 Python GUI 库: Tkinter: Tkinter 是 Python 的标准 GUI 库,它是一个开源的、跨平台…

【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的类和没有定义虚函数类的大小 )

文章目录 一、验证指向 虚函数表 的 vptr 指针 是否存在1、虚函数表与 vptr 指针由来2、虚函数类与普通函数类对比 - 多出了 vptr 指针的大小 对比 定义了 虚函数 的类 与 没有定义虚函数的类 的大小 , 其它成员都相同 , 定义了虚函数的类多出了 4 字节 , 多出的 4 字节就是 vp…

Windows11无法打开Photoshop CC 2017问题解决

情况描述: Windows11上,双击Photoshop CC 2017没反应 解决办法: 此时需要启动Windows的“事件查看器”来确认问题出在哪里。可以直接通过开始菜单搜索启动,也可以通过右键点击“此电脑”->“管理”,然后找到事件查…