Java 汉诺塔问题 详细分析

汉诺塔

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


n = 1


 n = 2


n = 3 

正常移动汉诺塔的步骤:


前面n = 1 和 n = 2 的时候 还比较简单,我们可以直接挪动。

下面我们用递归的思想再移动一下:

递归 就是 将复杂的问题简单化,详细的说就是 一个复杂的大问题 可以 化解成 多个相同的小问题,而这些小问题 可以 利用递归的思想逐一的解决。 

提前声明:

A : 起始位置

B : 中转位置

C : 目标位置  

注意:此处的 起始位置 中转位置 目标位置 并不是固定的,具体的需要看我们怎么传参 

需要借助中转位置 去 帮助我们实现 将最下面 一层圆盘 移动到 目标位置 上 

     

A 上 n - 1 个 圆盘 借助 C 移动到 B

解释: 此处 将n - 1 个 圆盘 移动到  中转位置 就需要递归的思想

我们 需要 把 n - 1 个圆盘 看作一个整体 直接 放到 B 上 (当然其中具体步骤还是比较麻烦的,但这些具体麻烦的步骤在递归中就已经实现了)

这时就体现我们递归的优点了,我们只需要关注 关键问题 其中比较繁琐的步骤 我们可以直接忽略 (文章结尾的代码 可以 清楚的看到) 


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

/**
 *
 * @param n 圆盘个数
 * @param pos1 起始位置
 * @param pos2 中转位置
 * @param pos3 目标位置
 */
public static void hanio (int n, char pos1 ,char pos2,char pos3){
    //结束递过程的条件
    if(n == 1){
        move(pos1,pos3);
    }else {
        hanio(n-1,pos1,pos3,pos2); //将 n-1 个圆盘 看成一个整体 借助 pos3 位置 移动到 pos2
        move(pos1,pos3);  //将最大最底层的 圆盘 放到 目标位置
        hanio(n-1,pos2,pos1,pos3); // 再将剩下的 n - 1 个 圆盘 从 pos2 借助 pos1 移动到 pos3
    }

}


public static void main(String[] args) {
    hanio(1,'A','B','C');
    System.out.println();
    hanio(2,'A','B','C');
    System.out.println();
    hanio(3,'A','B','C');
    System.out.println();
    hanio(4,'A','B','C');
}

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

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

相关文章

华为手机怎么打印文件?

关于华为手机打印的问题,如果您有打印机,并且已经成功和华为手机相连,在解决上就要容易很多。 具体操作如下: 选择文件 文件来源:华为手机上的文件可以来自多个应用,如图库、备忘录、文件管理等&#xf…

Python入门 2024/7/2 While

目录 while循环的基础应用 循环输出十次:键盘敲烂,月入过万 计算1~100的和 用while循环练习猜数字 while循环的嵌套应用 打印九九乘法表 输出不换行的功能 while循环的基础应用 格式: while 条件: 条件满足时&#xff0c…

leetcode刷题:vector刷题

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:leetcode刷题 1.只出现一次的数字 这道题很简单,我们只需要遍历一次数组即可通过异或运算实现。(一个数与自身异或结果为0,任何数与0异或还是它本身) class Solut…

Nuxt3 的生命周期和钩子函数(八)

title: Nuxt3 的生命周期和钩子函数(八) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文介绍了Nuxt3框架中的一些重要生命周期钩子,如prepare:types用于自定义TypeScript配置和类型声明,…

ubuntu apt命令 出现红色弹框 Daemons using outdated libraries

1. 弹框没截图,是因为ubuntu22.04一个新特性导致的,由 needrestart 命令触发,默认情况是交互性质的,也就是会中断在这里需要手动要处理提示。 2. 修改/etc/needrestart/needrestart.conf 文件,将 #$nrconf{restart} …

解决obsidian加粗字体显示不突出的问题

加粗字体显示不突出的原因:默认字体的加粗版本本来就不突出 解决方法:改成显示突出的类型Microsoft YaHei UI 【效果】 修改前:修改后: 其他方法: 修改css(很麻烦,改半天也不一定奏效&#…

mac上使用finder时候,显示隐藏的文件或者文件夹

默认在finder中是不显示隐藏的文件和文件夹的,但是想创建.gitignore文件,并向里面写入内容,即便是打开xcode也是不显示这几个隐藏文件的,那有什么办法呢? 使用快捷键: 使用finder打开包含隐藏文件的文件夹…

CleanMyMac残留项可以删除吗 mac清理卸载残留文件怎么清理 如何清除MacBook上残留的软件垃圾

如果您不知道Mac电脑如何删除文件,不知道如何删除残留文件,不用担心,本篇文章为大家介绍删除普通文件和删除应用卸载后残留文件的方法。 苹果电脑怎么删除文件? 对于一般的文件,在Mac上将其删除掉不是一件很难的事&a…

【Python】字典练习

python期考练习 目录 1. 首都名​编辑 2. 摩斯电码 3. 登录 4. 学生的姓名和年龄​编辑 5. 电商 6. 学生基本信息 7. 字母数 1. 首都名 初始字典 (可复制) : d{"China":"Beijing","America":"Washington","Norway":…

信息学奥赛初赛天天练-42-CSP-J2020基础题-变量地址、编译器、逻辑运算、逻辑与运算、逻辑或运算、冒泡排序、递归应用

PDF文档公众号回复关键字:20240702 2020 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1.在内存储器中每个存储单元都被赋予一个唯一的序号,称为( &#xff0…

pandas数据分析(4)

修改DataFrame数据的最简单的方法是通过loc和iloc属性为某些元素赋值。 首先构造一组数据 通过标签或位置设置值 也可以一次修改多个值: 通过布尔索引设置数据 将所有来自China,或者年龄20以下的人名字设置为匿名: 通过替换值设置数据 如果…

粤港联动,北斗高质量国际化发展的重要机遇

今年是香港回归27周年,也是《粤港澳大湾区发展规划纲要》公布5周年,5年来各项政策、平台不断为粤港联动增添新动能。“十四五”时期的粤港澳大湾区,被国家赋予了更重大的使命,国家“十四五”《规划纲要》提出,以京津冀…

EEPROM内部原理

A2, A1, A0是EEPROM的地址引脚,用于设置设备地址。它们的作用如下: 设备寻址: 这三个引脚允许在I2C总线上唯一地标识EEPROM芯片。通过不同的连接方式(接高、接低或悬空),可以为同一类型的EEPROM芯片设置不同…

[PyTorch]:加速Pytorch 模型训练的几种方法(几行代码),最快提升八倍(附实验记录)

本篇文章转自:Some Techniques To Make Your PyTorch Models Train (Much) Faster 本篇博文概述了在不影响 PyTorch 模型准确性的情况下提高其训练性能的技术。为此,将 PyTorch 模型包装在 LightningModule 中,并使用 Trainer 类来实现各种训…

Ubuntu开通5005端口 记录

Ubuntu版本:20.04 使用systemctl status firewalld查看防火墙状态,报错Unit firewalld.service could not be found 报错的原因是没有安装firewall,安装命令为sudo apt install firewalld,然后进行安装 安装完成后输入systemctl…

【日常记录】【JS】动态执行JS脚本

文章目录 1、第一种方式:eval2、第二种方式:setTimeout3、第三种方式:创建script 标签插入body4、第四种方式:创建 Function5、对比6、 参考链接 1、第一种方式:eval 语法 eval(string)参数 string:一个…

Windows编程上

Windows编程[上] 一、Windows API1.控制台大小设置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封装为Innks 2.控制台字体设置以及光标调整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…

DLS-42/5-5双位置继电器 DC220V 板后接线 约瑟JOSEF

DLS-40系列双位置继电器型号: DLS-41/10-2双位置继电器; DLS-41/9-3双位置继电器 DLS-41/8-4双位置继电器; DLS-41/6-6双位置继电器; DLS-42/9-1双位置继电器; DLS-42/8-2双位置继电器; DLS-42/7-3双位…

2024护网整体工作预案示例

目录 第1章 HW整体工作工作部署 1.1 工作组织架构 1.2 各部门工作职责 1.3 演练期间工作机制 1.3.1 工作汇报机制 1.3.2 应急响应机制 第2章 系统资产梳理整改 2.1 敏感信息梳理整改 2.2 互联网资产发现 2.3 第三方供应商梳理 2.4 业务连接单位梳理 第3…

【C++】main函数及返回值深度解析

一.main函数介绍 1.main函数怎么写 #include <iostream>int main() {// 程序的代码放在这里std::cout << "Hello, World!" << std::endl;return 0; }在这个例子中&#xff1a; #include <iostream> 是预处理指令&#xff0c;它告诉编译器…