Java|汉诺塔问题详解

article/2025/9/7 18:47:45

文章目录

    • 汉诺塔问题:
    • 编程要求:
    • 解题过程:
    • 代码实现:
    • 总结

汉诺塔问题:

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

——来自于百度百科

编程要求:

  • 有A、B、C三根柱子,A为起始柱,B为辅助柱,C为目标柱,以及若干圆盘,圆盘按上小下大的顺序堆放在A柱上,从上到下依次为每一个圆盘标号为 1 到 n
  • 输入圆盘数,要求将A柱的圆盘移动到C柱,一次只能移动一个,过程中可以任意使用三根柱子,但是要保证小圆盘始终在上
  • 输出每一个圆盘每一步移动的过程,比如:1号圆盘从 A -> C

解题过程:

首先我们要知道,无论有多少个圆盘,最底下的圆盘 n 想要从起始柱移动到目标柱上,得先把除了 n 以外的圆盘移动到 移动到辅助柱上

也就是说,如果有 n 个圆盘,我们想把第 n 个移到 C 上,得先把上面的 n-1 个移动到 B 柱,然后才能把第 n 个圆盘移动到C上

那么问题又来了,想把 n 上面的 n-1 个圆盘移动到 B 上,我们又需要把第 n-1 个圆盘上面的 n-2 个圆盘先移到 C 上,才能把第 n-1 个移到 B 上

……以此类推

直到我们拆分到只剩下1个的时候,我们可以直接把第 1 个圆盘移动到 B 或 C,具体让 1 号圆盘移动到哪一个让程序来实现

<img src="/Users/harley/Desktop/笔记图片/汉诺塔问题.jpg" alt="汉诺塔问题"

有了上面的想法做铺垫,我们就可以来思考,该怎么写代码了:

如果你理解了上面的内容,不难发现,移动 n 个圆盘,实际上就是先移动 n 上面的 n-1 个圆盘的问题

移动 n-1 个圆盘就是上就是移动 n-1号圆盘上面的 n-2个圆盘的问题……

实际上,只要是2个及2个以上的圆盘,其动作都是一样的,先把上面的圆盘移动到辅助柱,然后再把最底下的圆盘移动到目标柱上

根据这点,我们就可以利用递归来实现这段代码

我们首先需要定义一个方法:

public static void fib(int num, char a, char b, char c) {if(num == 1) {System.out.println("第" + num + "个圆盘从" + a + "移动到" + c);}else {fib(num - 1, a, c, b);System.out.println("第" + num + "个圆盘从" + a + "移动到" + c);fib(num - 1, b, a, c);}
}

方法接收了需要移动的圆盘的个数 num,以及起始柱 a,辅助柱 b,目标柱 c,这里的变量 a 始终代表起始柱,变量 b 始终代表辅助柱,变量 c 始终代表目标柱

代码解析:

注意 :a是个变量,存放起始柱,最开始为A柱,变量b、c同理

这个代码最底层只能实现把起始柱 a 上的最上面的圆盘移动到目标柱 c 上
而变量 a 中存放的就是起始柱,圆盘在移动的过程中,不可能一直都是 A 柱移到 C 柱
因此每次要移动的圆盘的起始柱、辅助柱以及目标柱都可能不一样

第一次进入方法的时候:

当你把 n 上面的 n-1 个圆盘移动到 B 柱上时,A是起始柱,C时辅助柱,B才是目标柱
接下来你要把第 n 个移动到 C 柱,此时不需要调用方法,直接从 a 移动到 c上
最后把 B 柱上的 n-1 个移动到 C 柱,此时 B 是起始柱,A 为辅助柱,C 是目标柱

如果以上的内容你都明白了,那么就没必要再往下深究 n-1 上面的 n-2 个圆盘的移动过程,因为真的很容易被绕晕

我们写出这个方法之后只需要想着如何调用他就好了,剩下的交给程序

代码实现:

public class Test {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("请输入圆盘的数量");int num = in.nextInt();hanoi(num, 'A', 'B', 'C');//起始柱、辅助柱、目标柱默认为A、B、C}//汉诺塔问题实现//a存放起始柱,b存放辅助柱、c存放目标柱public static void hanoi(int num, char a, char b, char c){if (num == 1) {System.out.println("第" + num + "个圆盘从" + a + " -> " + c);}else{hanoi(num - 1, a, c, b);//借助c把第 num 个以外的圆盘从a移动到bSystem.out.println("第" + num + "个圆盘从" + a + " -> " + c);//把第num个从a移动到chanoi(num - 1, b, a, c);//借助a把第 num 个以外的圆盘从b移动到c}}}
//执行结果
请输入圆盘的数量
31个圆盘从A -> C2个圆盘从A -> B1个圆盘从C -> B3个圆盘从A -> C1个圆盘从B -> A2个圆盘从B -> C1个圆盘从A -> C

总结

汉诺塔问题的代码,第一次就从微观角度去看,即研究每一个圆盘是如何移动,可能比较难以理解,因此写完fib之后,我们干脆把方法fib当作一个别人写好的函数,只要能通过调用函数辅助我们解决问题即可

当然,如果你能很轻易理解这段函数,不妨尝试分析一下圆盘是如何移动的

如果以上内容能够帮助到你,那我很高兴我写的博客还是有用的

如果有地方描述不当,望大佬指正,感谢!!


http://chatgpt.dhexx.cn/article/pr2HGtH1.shtml

相关文章

C++解决汉诺塔问题

Description 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C&#xff0c;A上面套着 n n n个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个小&#xff0c;依次叠上去&…

汉诺塔问题超级详解

汉诺塔 汉诺塔问题图解代码 汉诺塔问题 1&#xff0c;我们为了后期方便讲解首先进行一个简单的命名—— 起始柱&#xff1a;1&#xff1b; 过度柱&#xff1a; 2&#xff1b; 目标住&#xff1a;3&#xff1b; 2&#xff0c;由于汉诺塔问题是一个明显的递归问题&#xff0c;所以…

汉诺塔问题解析(C语言)

文章目录 背景一、汉诺塔和递归二、代码实现总结 背景 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄…

python实现汉诺塔问题

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞n片黄金圆盘。大梵天命令婆罗门把圆盘从下自上开始、按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;小圆盘上不能放…

Python实现 — — 汉诺塔问题

我们今天来看一个很有意思的实例&#xff0c;叫做汉诺塔问题。 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着…

汉诺塔问题(Python实现)

前言 1.先谈一下什么是递归&#xff1f; 我自己的理解就是&#xff1a;将自身的问题不断减小规模&#xff0c;直到减小到无法减小为止。&#xff08;到达递归结束条件&#xff09;然后从小问题开始解决&#xff0c;小问题逐个解决之后&#xff0c;大问题也就迎刃而解了&#…

汉诺塔问题详解(C语言)

文章目录 前言1. 导入汉诺塔问题2. 预备知识3. 分析问题4. 编程解决问题 前言 汉诺塔问题是一个古典的数学问题&#xff0c;本文主要和大家一起用c语言解决汉诺塔问题。 1. 导入汉诺塔问题 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜…

汉诺塔问题——递归算法

一、问题描述 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把…

汉诺塔问题详解

目录 一、汉诺塔问题 二、汉诺塔问题思路 三、图示化思路 1、汉诺塔一个盘子 2、汉诺塔两个盘子 3、汉诺塔三个盘子 4、想法 四、代码的实现 一、汉诺塔问题 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源…

c语言汉诺塔问题详解

一、前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按…

图解汉诺塔问题(递归求解)

汉诺塔&#xff1a;汉诺塔(Tower of Hanoi)源于印度传说中&#xff0c;大梵天创造世界时造了三根金钢石柱子&#xff0c;其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;在小圆盘上不能放大圆…

汉诺塔(Hanoi)问题归纳总结

一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔&#xff1a; 外文算法书对汉诺塔问题的描述&#xff1a; 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步。 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可以清晰的看出分治思想以及递归过程 算法采用了分治的…

汉诺塔问题(Hanoi)

汉诺塔问题&#xff0c;是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘&#xff0c;三根柱子分别为起始柱A、辅助柱B及目标柱C。 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置…

经典递归算法——汉诺塔问题

一、问题背景简介 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff…

【C语言】递归详解汉诺塔问题

文章目录 前言汉诺塔移动图解汉诺塔移动次数汉诺塔的打印结语 如果无聊的话&#xff0c;就来逛逛 我的博客栈 吧! &#x1f339; 前言 汉诺塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小…

Linux基本操作---实践+理解--CentOS 7

目录 CentOS系统ls查看信息cd目录切换文件操作系统关闭/重启防火墙操作 CentOS系统 Linux系统有很多&#xff0c;常见的Linux系统有乌班图&#xff08;Ubuntu&#xff09;、深度&#xff08;deepin&#xff09;、CentOS等等&#xff0c;CentOS 7 是目前比较流行的Linux操作系统…

Linux 文件操作基本命令

在Linux文件操作中&#xff0c;最常用的基本命令包括&#xff1a;打开或者创建文件&#xff0c;写入文件&#xff0c;读取文件 下面将依次介绍这几种操作的常用方法。 1.打开/创建文件 首先说明在VI编辑模式中&#xff0c;若要使用该API&#xff0c;需包含相应的头文件&…

Linux基本操作命令 实验

一、实验目的&#xff1a; 1. 熟悉Linux基本命令。 2. 熟悉Linux操作系统。 二、实验环境&#xff1a; 一台装有Linux的机器。 三、实验内容&#xff1a; 1.文件操作命令的使用。 用vi编辑器新建一个testl文件 输入this is testl~&#xff01; 查看文件与目录ls 进入…

linux的基本操作命令

1.使用timedatectl查看时间状态 列出所有已知时区 修改时区为列出时区的某一个 首先打开linux系统&#xff0c;进入管理员模式&#xff0c;输入timedatectl [rootroot ~]# timedatectl Local time: Sun 2022-03-20 17:26:05 CSTUniversal time: Sun 2022-03-20 09:26:05 …

Linux实验一:熟悉Linux基本命令

【实验目的】 ‏(1)熟悉常用的文件和目录类命令。 ‏(2)熟悉常用的进程管理类命令。 ‎ ‏【实验要求】 ‎ 本实验的主要任务是在Linux终端窗口中练习已经学过的各种命令&#xff0c;熟练掌握常用命令的用法。清大家按照以下步骤完成本次实验。 ‏(1)以普通用户登录系统&…