当前位置: 首页 > 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. 小结

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

http://www.lryc.cn/news/460753.html

相关文章:

  • 《为什么要在三层交换机 VLAN 上配置 IP 地址?》
  • Git的基本使用入门
  • Elasticsearch 入门
  • WebSocket 集成 Spring Boot 的实战指南
  • 无人机集群路径规划:四种优化算法(BKA、CO、PSO、PIO)求解无人机集群路径规划,提供MATLAB代码
  • 第二届 龙信杯 电子数据取证竞赛部分Writeup
  • 偷啥的都有!
  • 【中文注释】planning_scene_tutorial.cpp
  • 【Vue3】 h()函数的用法
  • Flask如何实现前后端分离项目
  • 二维码生成器 1.02.41| 一站式QR码生成器和美化工具
  • 腾讯云视立方·直播 SDK 合规使用指南
  • 在 Spring 中使用 @EhCache 注解作为缓存
  • npm install进度卡在 idealTree:node_global: sill idealTree buildDeps
  • 力扣1031. 两个非重叠子数组的最大和
  • 【Unity实战篇】 接入百度翻译,实现文本自动翻译功能
  • ubuntu samba
  • Linux系统和数据库常用的命令2
  • Golang | Leetcode Golang题解之第468题验证IP地址
  • mermaid 图表相关
  • Unity接入人工智能
  • C语言笔记 14
  • Cpp::STL—list类的模拟实现(上)(13)
  • ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能
  • PetaLinux工程的常用命令——petalinux-build
  • 【Qt】窗口预览(1)—— 菜单栏
  • 揭秘酱香型白酒中的6大劣质酒的特点,守好你的健康与钱包
  • C#拓展方法
  • 02.顺序表、链表简述+对比
  • 前端布局与响应式设计综合指南(三)