【Java SE 题库】递归的魅力之--> 汉诺塔问题

news2024/10/11 21:00:34

 🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

 1. 题目

2. 分析

2.1 图解

2.2 代码解析

3. 完整代码

 3.1 运行截图

4. 小结


 1. 题目

汉诺塔问题是一个经典的递归问题,源自一个古老的印度传说。在这个问题中,我们有三根柱子和一系列不同大小的圆盘,这些圆盘最初按大小顺序堆叠在一根柱子上。目标是将所有圆盘移动到另一根柱子上,遵循两个规则:一次只能移动一个圆盘,且在移动过程中较大的圆盘不能放在较小的圆盘上面。

2. 分析

2.1 图解

首先我们不能一口吃下去,我们要一步一步来看

  • 如果只有一个盘子     (n == 1) 

 

那么直接 A --> C 就行了

  •  如果只有两个盘子     (n == 2)

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

这是基本步骤,显然发现不了什么规律

  • 如果只有三个盘子     (n == 3)

 

 都存在特殊情况:(n - 1)个盘子在 B 柱子上,最大的盘子在 C 柱子上,把(n - 1)个盘子看作整体(借助 A 柱子)放到 C 柱子上

  • 如果只有四个盘子     (n == 4)

 

不管怎么移动, 都存在特殊情况:(n - 1)个盘子在 B 柱子上,最大的盘子在 C 柱子上,把(n - 1)个盘子看作整体(借助 A 柱子)放到 C 柱子上

那这时候,递归规律就出来了 

 一句话:先把 A 柱子上(n - 1)个盘子放在 B 柱子上,在将 A柱子上第 n 个盘子放在 C 柱子上,然后将 B 柱子上(n - 2)个盘子放在 A 柱子上,在讲 B 柱子上第 (n - 1)个盘子放在 C 柱子上.....依次递归下去

2.2 代码解析

先定义一个方法用来打印运动过程

    public static void move(char p1, char p2) {
        System.out.print(p1 + " -> " + p2 + " ");
    }

在定义方法进行递归

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

这里进行代码解释

  • pos 1 ,pos 2 ,pos 3 分别代表   A      B      C  (柱子)
  • if() 语句表示有一个盘子的话,只需盘子运动一次即可
  • pos 1 :盘子的起始柱子
  • pos 2 :盘子的借助的柱子(中转位置)
  • pos 3 :盘子的终点位置(最终位置)
  • 第六行代码意思是-> 先将 A 柱子的(n - 1)个盘子借助 C 柱子移到 B 柱子上
  • 第七行代码意思是-> 在将 A 柱子剩的一个最大的盘子移到 C 柱子上
  • 第八行代码意思是->将 ​​B 柱子的(n - 1)个盘子借助 A 柱子移到 C 柱子上

3. 完整代码

public class Test {

    public static void move(char p1, char p2) {
        System.out.print(p1 + " -> " + p2 + " ");
    }
    /*
    * pos1:起始位置
    * pos2:中转位置
    * pos3:终点位置
    * */
    public static void Htower(int n, char pos1, char pos2, char pos3) {
        if(n == 1) {
            move(pos1, pos3);
            return ;
        }
        Htower(n - 1, pos1, pos3, pos2);
        move(pos1, pos3);
        Htower(n - 1, pos2, pos1,pos3);
    }

    public static void main(String[] args) {
        // 用多组数据检测
        Htower(1,'A', 'B', 'C');
        System.out.println();
        Htower(2,'A', 'B', 'C');
        System.out.println();
        Htower(3,'A', 'B', 'C');
        System.out.println();
        Htower(4,'A', 'B', 'C');
        System.out.println();
        Htower(5,'A', 'B', 'C');
        System.out.println();
    }

}

 3.1 运行截图

4. 小结

以上就是对该题的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持! 

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

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

相关文章

MYSQL MVCC多版本并发控制机制与原理、可重复读/读已提交原理

1,前置知识回顾 1.1,当前读和快照读 根据前面章节可知,mysql在【可重复读】(RR)的事务隔离机制下,同一个事务中的多次读取结果是一样的。而【读已提交】(RC)事务隔离机制&#xff0c…

Spring Integration + MQTT

1. 简介 Spring Integration: Spring Integration是一个开源的Java库,用于构建基于消息的应用程序。它提供了一套丰富的组件和工具,使得开发者可以轻松地开发出可靠、灵活和可扩展的集成解决方案。以下是Spring Integration的一些主要用途&…

剪辑视频怎么学?四大工具助你轻松入门!

无论是制作短视频、记录生活点滴,还是从事专业影视制作,掌握视频剪辑技巧都至关重要。那么,剪辑视频怎么学呢?本文将为大家推荐四款实用的视频剪辑工具,助你轻松入门! 福昕视频剪辑:简单易用&a…

基于SpringBoot+Vue的医院预约挂号管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

使用Postman搞定各种接口token实战!

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

1.1 前端技术的发展

大家好!今天,我将与大家分享一个非常有趣的话题——前端技术的发展。在这个数字化时代,前端技术已经成为我们日常生活中不可或缺的一部分。我们的学习目标是了解前端技术的发展,并探讨使用框架开发项目的优势。 首先,…

基于大模型LLama2+Langchain构建知识库问答系统

1 背景 知识库需求在各行各业中普遍存在,例如制造业中历史故障知识库、游戏社区平台的内容知识库、电商的商品推荐知识库和医疗健康领域的挂号推荐知识库系统等。传统知识库搜索系统基于关键字匹配,缺少对用户问题理解和答案二次处理能力。为保证推荐系…

Go-知识泛型

Go-知识泛型 1. 认识泛型1.1 不使用泛型1.2 使用泛型 2. 泛型的特点2.1 函数泛化2.2 类型泛化 3. 类型约束3.1 类型集合3.2 interface 类型集合3.2.1 内置interface类型集合3.2.2 自定义interface类型集合3.2.2.1 任意类型元素3.2.2.2 近似类型元素3.2.2.3 联合类型元素 3.2.3 …

腾讯云直播录制相关

直播录制的原理是什么? 对于一条直播流,一旦开启录制,音视频数据就会被旁路到录制系统。主播的手机推上来的每一帧数据,都会被录制系统追加写入到录制文件中。 一旦直播流中断,接入层会立刻通知录制服务器将正在写入的…

for深入学习作业

作业&#xff1a; 写一个程序判断1-100中9的个数 代码: #include<stdio.h> int main() {int i 9,sum0;for (i 9; i < 100; i) {if ((i % 10 9) || (i / 10 9)) {sum;}}printf("%d", sum);return 0; } //9 19 29 39 49 59 69 79 89 99 //91 92 93 94 …

LVGL设计汽车仪表盘(开源!!)

驾驶界面图 有图无真相&#xff0c;下面视频展示&#xff1a; 汽车仪表盘展示 资源已绑定&#xff0c;自行下载哦 关注我&#xff0c;后面出LVGL移植教程&#xff01;

在线拍卖|基于springBoot的在线拍卖系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 摘要 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、留言板管理、系统管理&#xff0c;用户&am…

【动手学电机驱动】 TI InstaSPIN-FOC(1)电机驱动和控制测试平台

【动手学电机驱动】 TI InstaSPIN-FOC&#xff08;1&#xff09;电机驱动和控制测试平台 1. 本系列的资源需求1.1 电机驱动控制概况1.2 InstaSPIN-FOC 电机控制方案1.3 资源需求 2. 软件安装2.1 安装 CCS2.2 安装 MotorWare2.3 安装 ControlSUITE&#xff08;可选&#xff09; …

中科星图GVE(案例)——AI实现地块提取

目录 简介 函数 gve.Services.AI.plotExtraction(image) 代码 结果 知识星球 机器学习 简介 AI可以通过图像处理和机器学习算法实现地块提取。首先&#xff0c;AI可以对高分辨率遥感图像进行预处理&#xff0c;包括图像校正和去噪等处理。然后&#xff0c;AI可以使用图…

如何挑选Axure元件库? Axure原型赏析

在挑选Axure元件库时&#xff0c;可以从以下几个方面进行考虑和赏析&#xff0c;以确保选择到最适合项目需求的元件库&#xff1a; 一、元件库的全面性和丰富度 组件全面&#xff1a;优秀的Axure元件库应包含丰富的元件类型&#xff0c;以高效应对各种复杂业务流程的原型设计…

探索OAuth 2.0授权模式:全面解析与场景应用选择

文章目录 1. 什么是OAuth 2.0授权模式&#xff1f;2. 授权模式详解2.1 客户端凭证模式&#xff08;Client Credentials Grant&#xff09;2.2 授权码模式&#xff08;Authorization Code Grant&#xff09;2.3 简化模式/隐藏式&#xff08;Implicit Grant&#xff09;2.4 密码模…

解决:Ubuntu连接不上网络

今天莫名奇妙&#xff0c;我的ubuntu20.04断网了。检查了一下&#xff0c;使用的也是桥接模式&#xff0c;啥也没有变化。 然后我上Ubuntu16.04版本看了&#xff0c;那里又可以成功上网&#xff0c;所以&#xff0c;不是电脑的问题。 看了网上两个教程&#xff0c;解决了。 …

深入理解 Maven Profiles

前言 在现代软件开发中&#xff0c;项目通常需要部署到多种环境中&#xff0c;比如开发&#xff08;development&#xff09;、测试&#xff08;test&#xff09;和生产&#xff08;production&#xff09;。每种环境可能具有不同的配置需求。为了满足这种多样性&#xff0c;A…

还在找地图切片工具?这五款免费软件值得一试

地图切片&#xff08;Map Tiling&#xff09;是指将大型地图或影像数据按照一定的规则切割成多个较小的图块&#xff08;称为瓦片&#xff09;&#xff0c;并根据缩放级别和用户请求逐步加载这些瓦片&#xff0c;从而提升地图在网络或应用中的显示速度和效率。地图切片技术广泛…

ABAP SE37创建FUNCTION报错:函数的主程序不是以function-pool开头

问题&#xff1a;SE37在新建函数时&#xff0c;检查语法没有问题&#xff0c;但激活报错&#xff1a;函数"***"的主程序不是以function-pool开头; 原因&#xff1a;新建函数的函数组没有激活&#xff0c;可以通过se80或在SE37跳转进行激活 按一下路径 右键激活即可