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

 🔥博客主页🔥:【 坊钰_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.rhkb.cn/news/444613.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

双十一买些提高幸福感的生活单品!五款精选好物推荐~

双十一购物狂欢即将来临,这是一年一度的购物盛宴,家电和数码产品通常会在这个时期提供诱人的折扣。但品牌众多,每款产品又各有千秋,让人难以抉择。今天,我将分享一些在双十一期间值得考虑的高品质好物,让我…

AI与物理学的交汇:Hinton与Hopfield获诺贝尔物理学奖

诺贝尔物理学奖颁给了AI!机器学习先驱Hinton与Hopfield联手获奖,出乎所有人的意料。 今年的诺贝尔物理学奖颁给了机器学习领域的两位先驱,杰弗里辛顿(Geoffrey Hinton)和约翰霍普菲尔德(John Hopfield&…

外包干了6天,技术明显退步。。。

我是一名大专生,自20年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年9月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

Netty学习笔记

0.NIO三大组件(channel、selector、buffer) 1.channel: 相当于socket,和socket相比是非阻塞式的 2.selector: 和一个线程组成一个整体,对channel进行轮询,对事件进行监听和派发 3.buffer&#x…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(一)

利用FnOS搭建虚拟云桌面,并搭建前端开发环境 一 飞牛FnOS官方文档一、安装FnOS【Win11系统】1.下载VirtualBox2.下载FnOS镜像3.创建虚拟机4.启动完成后,会进入这样一个界面,这个基本上后续就后台了 本人在网上冲浪了很久,一直也没…

MySQL之复合查询与内外连接

目录 一、多表查询 二、自连接 三、子查询 四、合并查询 五、表的内连接和外连接 1、内连接 2、外连接 前面我们讲解的mysql表的查询都是对一张表进行查询,即数据的查询都是在某一时刻对一个表进行操作的。而在实际开发中,我们往往还需要对多个表…

json格式的post请求目前不行, 要换成form表单形式的post请求怎么改

问: 下面是我的代码 export function fetchDeleteList<T>(agentSessionId: string) {return post<T>({url: http://192.168.0.116:8089/pipe-ics/agent/delete,method: post,data: { agentSessionId },}) } 目前是json格式的post请求, 目前不行, 要换成form表单…

Pandas处理时间序列之光谱分析与聚类

import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…

Android OpenGLES2.0开发(四):矩阵变换和相机投影

事物的本质是事物本身所固有的、深藏于‌现象背后并决定或支配现象的方面‌。 还记得我们上一篇绘制的三角形吗&#xff0c;我们确实能够顺利用OpenGL ES绘制出图形了&#xff0c;这是一个好的开始&#xff0c;但这还远远不够。我们定义的坐标是正三角形&#xff0c;但是绘制出…

YoloV10改进策略:BackBone改进|CAFormer在YoloV10中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV10模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

学习博客写作

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

解决银河麒麟桌面操作系统V10(ARM)中`apt-get update`“正在等待报头”问题

解决银河麒麟桌面操作系统V10&#xff08;ARM&#xff09;中apt-get update“正在等待报头”问题 1、问题描述2、 解决方法步骤一&#xff1a;打开终端步骤二&#xff1a;清理APT缓存步骤三&#xff1a;再次尝试更新软件源 &#x1f496;The Begin&#x1f496;点点关注&#x…

spring面试之2024

1、什么是spring? Spring是一个Java开发框架&#xff0c;它提供了一种可扩展的模型来开发Java应用程序。Spring框架的目标是提供一个全面的解决方案&#xff0c;用于构建企业级应用程序。Spring框架的核心特点包括依赖注入&#xff08;DI&#xff09;、面向切面编程&#xff…

django的路由分发

前言&#xff1a; 在前面我们已经学习了基础的Django了&#xff0c;今天我们将继续学习&#xff0c;我们今天学习的是路由分发&#xff1a; 路由分发是Web框架中的一个核心概念&#xff0c;它指的是将不同的URL请求映射到对应的处理函数&#xff08;视图&#xff09;的过程。…

如何提高专利申请的成功率?

在当今充满创新与竞争的时代&#xff0c;专利成为了保护智力成果、赢得市场优势的重要武器。然而&#xff0c;专利申请并非一帆风顺&#xff0c;许多申请人在这一过程中面临诸多挑战&#xff0c;导致申请成功率不尽如人意。那么&#xff0c;如何才能在这复杂的专利申请之路上提…

宝塔 进程守护管理器 神坑,再次跌入。thinkphp-queue队列 勤勤学长

如果&#xff0c;你有在使用【进程守护管理器】&#xff0c;记得在更新/重启&#xff0c;甚至卸载重新安装后&#xff0c;重启服务器。 事情的起因是&#xff0c;昨日服务器突然异常&#xff0c;网站无法正常访问&#xff0c;进入宝塔面板&#xff0c;发现 cpu和负载率均超过1…

2024.10月11日--- SpringMVC拦截器

拦截器 1 回顾过滤器&#xff1a; Servlet规范中的三大接口&#xff1a;Servlet接口&#xff0c;Filter接口、Listener接口。 过滤器接口&#xff0c;是Servlet2.3版本以来&#xff0c;定义的一种小型的&#xff0c;可插拔的Web组件&#xff0c;可以用来拦截和处理Servlet容…

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU&#xff08;服务数据单元&#xff09;相邻层间交换的数据单元&#xff0c;是服务原语的表现形式。在OSI模型中&#xff0c;SDU是某一层待传送和处理的数据单元&#xff0c;即该层接口数据的总和。 - SDU是某一层的数据集&#xff0c;准备传递给下一…