汉诺塔问题——递归算法

article/2025/9/7 19:16:53

一、问题描述

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

二、递归算法

        个人认为递归算法核心主要有以下几点:递归变量、递归过程、递归结束条件,其中难点在于怎么模拟递归过程以及如何寻找递归变量,对于不同的问题这两个核心所呈现的具体代码都是不一样的,但都有共同的特点。所以,建议读者不仅仅以解决汉诺塔问题为目标,更要理解递归思想,掌握递归算法在各种问题中的使用。

1.递归变量

        在每一个能够使用递归算法解决的问题中,题目会提供关键信息,我们需要在其中找到递归变量,这取决于你对信息解剖能力,如果一开始无法快速找到递归变量不用过于伤心,在往后的不断学习中,你会慢慢提高自己的编程能力,能够快速分析现实问题和程序之间的关系,从而找到递归变量,那些变量是在递归函数中表示递归层数或者起到其它作用,例如汉诺塔问题中,层数n,以及柱子位置A,B,C则是递归开始。

2.递归过程

        递归过程是递归算法中的关键行为,这个关键行为在解决问题中可以不断重复循环,最后递归变量达到结束条件就退出递归函数。如何在问题中找到这个关键行为是较难的,但这也是区分您是否理解递归思想。在分析汉诺塔问题,我们可以借助位置B,先把n-1层以上的圆盘放到B位置,然后把第n个圆盘放到C位置上,最后将n-1层以上的圆盘放到C位置上,那么就能够轻松解决问题了,但是,对于n-1层是如何移动B位置上的的呢?聪明的你可能已经发现n-1层圆盘从A移动到B上其实与n层圆盘移动到C位置上是一样的过程,即先把n-2层圆盘放到位置C上再把第n-1个圆盘放到位置B 上,最后n-2层圆盘放到B上,那么对于n-2层圆盘是如何放到C上的呢?其实这是一个重复性的过程。

        在这里为了将问题简单化,我们设置了三个变量:开始位置A、辅助位置B、目标位置C,开始位置A放置所有圆盘,将n-1层圆盘放置辅助位置B后,再将第n个圆盘放置目标位置C,然后将n-1层圆盘的位置B作为开始位置A,原来的开始位置A作为辅助位置B,将所有圆盘放到目标位置C。这个过程的关键点在于什么时候开始位置A和辅助位置B互换?

 

         我们最开始需要把n-1层圆盘放到辅助位置B,在放置n-1层圆盘时,我们把辅助位置B当作是目标位置C,将其将第n-1个圆盘放到它的目标位置,那么如此一来n-2层圆盘需要一个辅助位置所以此时辅助位置B与目标位置互换,按照这个想法不断寻找上一层圆盘,直至第一层圆盘时我们将其放置在目标位置C上即可(注意:此时的目标位置C可能不是原来的C),然后在回溯的过程中不断输入移动的圆盘(作用是看到圆盘移动的过程)。当n-1层圆盘移动到辅助位置B时,将第n个移动到目标位置C后,需要将第n-1个圆盘移动到目标位置C,此时则借助开始位置A,所以在这里,开始位置A需要与辅助位置B互换,原本n-1层圆盘所在的位置变成开始位置,然后重复搬圆盘的过程,直至所有圆盘放入目标圆盘,完成递归。

 

3.递归结束条件

        递归结束条件是用以结束递归过程的重复,如果没有结束条件,函数将会一直递归下去,使得程序陷入死循环中。那么如何找到递归结束条件呢?可以从递归变量中寻找,例如汉诺塔问题中,递归结束条件语句在于层数,当发现递归到第一层圆盘时,我们可以直接将它放到目标位置上,然后就是回溯的过程,这个工作就交给计算机,我们只需分析问题,写出解决问题的代码。

三、汉诺塔问题具体代码

#include <iostream>
using namespace std;
void move(int n, char A, char B, char C) {      //n代表现在需要将第n个圆盘放到目标位置Cif (n == 1)                                 //当递归到第1个圆盘时,直接将其放到目标位置Ccout << A << "->" << C << endl;else {move(n - 1,A,C,B);    //1.将n-1层圆盘放到辅助位置B//2.对于第n-1个圆盘,把B当作目标位置,C当作辅助位置,所以BC互换cout << A << "->" << C << endl;         //将第n个圆盘放到目标位置C上move(n - 1,B,A,C);         //1.将n-1层圆盘放到目标位置C//2.对于n-2层圆盘,A当作辅助位置,B当作开始位置,所以AB互换}
}
int main()
{move(64,'A', 'B', 'C');            //开始时,A是开始位置,B是辅助位置,C是目标位置return 0;
}

  注意:本代码以64层圆盘移动,若需要其他层圆盘,只需修改64数字即可。


http://chatgpt.dhexx.cn/article/5rbyTQXt.shtml

相关文章

汉诺塔问题详解

目录 一、汉诺塔问题 二、汉诺塔问题思路 三、图示化思路 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)以普通用户登录系统&…

linux配置网口的ip地址,Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址)...

Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址) 今天博主和大家聊一聊 Linux的基本操作&#xff0c;不喜勿喷&#xff0c;如有建议欢迎补充&#xff0c;讨论。 一.Linux网络 1.网卡的命名规则 CENTOS7采用dmidecode采集命名方案&#xff0c;以此来得到主板信息&…

Linux基本命令及编程环境实验

目录 一、Linux基本命令详细汇总 1、目录及文件相关命令 2、系统信息查询 3、文件操作&#xff08;统计、过滤、搜索、权限&#xff09; 4、其他命令 二、Linux终端上vi命令编程 1、进入vi命令模式 2、vi编辑模式 3、最后行模式 4、vi 编辑C源程序并编译运行 最后 一…

linux基本命令大全

基本命令 关机&#xff1a;shutdown -h halt init 0 poweroff 重启&#xff1a;shutdown -r reboot init 6 pwd&#xff1a;查看工作目录 ls&#xff1a;查看指定目录的内容 -l&#xff1a;列表显示 -a&#xff1a;显示所有&#xff0c;包括隐藏文件 -h&#xff1a;人性化的显示…

linux用户基本操作

用户的管理 1.创建一个新用户user1 ,设置其主目录为/home/use1 useradd user1 -d /home/user12.查看/etc/passwd文件的最后一行&#xff0c;看看如何记录 vim /etc/passwd3.查看文件/etc/shadow文件的最后一行 vim /etc/shadow4.给用户设置密码 passwd user1 123456//密码…

linux课程--实验一 Linux 基本命令操作1

一、实验目的&#xff1a; (1)掌握Linux各类命令的使用方法。 (2)熟悉Linux字符界面操作环境。 二、实验准备 (1)了解Linux命令行的基本概念。 (2)自己建立目录结构以及目录下的文件。 三、实验过程&#xff08;内容包括&#xff1a;&#xff08;1&#xff09;练习linux命…

操作系统实验一 Linux基本操作|实验二 进程管理

由于当时没存代码&#xff0c;只有实验文档代码截图&#xff0c;文末也可直接获取实验文档。 操作系统实验 目录 实验一 Linux基本操作实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统下的基本操作&#xff0c;对Linux操作系统有一个感性认识。 2.学…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&am…

操作系统——实验一(Linux基本操作)

操作系统——实验一(Linux基本操作) &#xff08;1&#xff09;练习Linux的基本安装和配置&#xff1b; &#xff08;2&#xff09;以root用户身份登陆&#xff0c;并使用“ls”,“cat”“cd”等常用命令来实现基本的文件操作并观察Linux文件系统的特点&#xff1b; &#xff…