当前位置: 首页 > news >正文

【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. 小结

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

相关文章:

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

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 分析 2.1 图解 2.2 代码解析 3. 完整代码 3.1 运行截图 4. 小结 1. 题目 汉诺塔问题是一个经典的递归问题,源自一个古老的印度传…...

《为什么要在三层交换机 VLAN 上配置 IP 地址?》

如果在三层交换机上划分了 VLAN10 和 VLAN20 但没有给 IP 地址的情况下,只有相同 VLAN 的端口之间才能相互通信。 这是因为在没有为 VLAN 配置 IP 地址(即没有创建 SVI,交换虚拟接口)时,三层交换机仅作为一个二层设备…...

Git的基本使用入门

参考:Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区,也叫 Working Directory暂存区,也叫 stage,index版本库,也叫本地仓库,commit History 将代码推…...

Elasticsearch 入门

ES 概述 ES 是一个开源的高扩展的分布式全文搜索引擎。 倒排索引 环境准备 Elasticsearch 官方地址:https://www.elastic.co/cn/ 下载地址: 注意:9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 h…...

WebSocket 集成 Spring Boot 的实战指南

🍁 作者:知识浅谈,CSDN签约讲师&博客专家,华为云云享专家,阿里云专家博主,InfoQ签约作者 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 &…...

无人机集群路径规划:四种优化算法(BKA、CO、PSO、PIO)求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化…...

第二届 龙信杯 电子数据取证竞赛部分Writeup

大佬文章: 龙信杯复现(23、24) | BthclsBlog 手机部分 资料:2024年第二届龙信杯 WP_2024龙信杯wp-CSDN博客 1.分析手机检材,请问此手机共通过adb连接过几个设备?[标准格式:3] 2 /data/a…...

偷啥的都有!

好久不做地铁了,昨个儿加班儿太晚,就没骑车回家。早上到了地铁站,想起我前一阵儿下雨时候,把自行车放在了地铁站,结果尾灯被人偷了! 真是偷啥的都有! 2024年10月15日 7:41...

【中文注释】planning_scene_tutorial.cpp

planning_scene_tutorial.cpp #include <rclcpp/rclcpp.hpp>// MoveIt 相关头文件 #include <moveit/robot_model_loader/robot_model_loader.h> #include <moveit/planning_scene/planning_scene.h> #include <moveit/kinematic_constraints/utils.h>…...

【Vue3】 h()函数的用法

目录 介绍 参数 使用案例 1.创建虚拟 DOM 元素 2. 组件的动态渲染 3. 创建功能组件 4.渲染动态属性 5. 使用插槽 6. 创建动态标签 介绍 h() 函数用于辅助创建虚拟 DOM 节点&#xff0c;它是 hypescript 的简称——能生成 HTML (超文本标记语言) 的 JavaScript&#x…...

Flask如何实现前后端分离项目

在现代Web开发中&#xff0c;前后端分离是一种常见的架构模式&#xff0c;其中前端和后端分别独立开发和部署&#xff0c;通过API进行通信。Flask作为后端框架&#xff0c;可以很容易地与前端框架&#xff08;如React、Vue.js或Angular&#xff09;配合使用来实现前后端分离。以…...

二维码生成器 1.02.41| 一站式QR码生成器和美化工具

二维码生成器是一个有用的QR码生成器应用程序。可以轻松地为网站链接、文本、WiFi、名片、短信、社交媒体账户等生成QR码。该应用支持更改QR码的颜色、码眼图案和框架&#xff0c;并可以添加徽标和文本&#xff0c;使QR码更加美观。使用此QR码生成器&#xff0c;可以使用设计精…...

腾讯云视立方·直播 SDK 合规使用指南

为帮助使用直播 SDK 的开发运营者&#xff08;以下简称“您”&#xff09;在符合个人信息保护相关法律法规、政策及标准的规定下合规接入、使用第三方SDK&#xff0c;深圳市腾讯计算机系统有限公司&#xff08;以下简称"我们"&#xff09;特制定《直播 SDK 接入使用说…...

在 Spring 中使用 @EhCache 注解作为缓存

文章目录 项目概况项目设置一个简单的 RESTful Web 服务Spring 整合 EhCache第 1 步&#xff1a;更新依赖项以使用 EhCache Spring 注解第 2 步&#xff1a;设置自定义缓存管理器第 3 步&#xff1a;配置 EhCache第 4 步&#xff1a;测试缓存 刷新缓存总结推荐阅读文章 EhCache…...

npm install进度卡在 idealTree:node_global: sill idealTree buildDeps

ping一下源&#xff1a;ping http://registry.npm.taobao.org/ ping不通&#xff0c;原因&#xff1a;原淘宝npm永久停止服务&#xff0c;已更新新域名~~震惊&#xff01;&#xff01;&#xff01; 重新安装&#xff1a;npm config set registry https://registry.npmmirror.c…...

力扣1031. 两个非重叠子数组的最大和

力扣1031. 两个非重叠子数组的最大和 题目解析及思路 题目要求找到两段长分别为firstLen 和 secondLen的子数组&#xff0c;使两段元素和最大 图解见灵神 枚举第二段区间的右端点&#xff0c;在左边剩余部分中找出元素和最大的第一段区间&#xff0c;并用前缀和优化求子数组…...

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

前言【Unity实战篇】 接入百度自动翻译,实现文本自动翻译功能一、获取百度翻译开发平台的APPID和密钥二、Unity中接入自动翻译功能三、Unity中实现自动翻译文本Text功能总结前言 日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。本篇文章将演示怎样在Unity中接入…...

ubuntu samba

参考&#xff1a; 基于Ubuntu22.04的Samba服务器搭建教程&#xff08;新手保姆级教程&#xff09;_ubuntu samba-CSDN博客 当时按照这个不行&#xff1a; 主要做了这些修改 1、ufw 打开端口 这些都打开了 Samba服务使用的端口和协议如下1234: Port 137 (UDP) - NetBIOS 名…...

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密&#xff0c;只需把公钥发送到server就可&#xff0c;会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…...

Golang | Leetcode Golang题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; func validIPAddress(queryIP string) string {if sp : strings.Split(queryIP, "."); len(sp) 4 {for _, s : range sp {if len(s) > 1 && s[0] 0 {return "Neither"}if v, err : strconv.Atoi(s); err …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...