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

article/2025/9/7 18:49:18

文章目录

  • 背景
  • 一、汉诺塔和递归
  • 二、代码实现
  • 总结


背景

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


一、汉诺塔和递归

当我们想将64个圆盘从A柱移动到C柱上,我们可以将其分为三个步骤:
步骤1、通过一种符合要求的方式将A柱上63个圆盘从A移动到B(我们不要关心这个方式具体是什么)
步骤2、经过步骤1之后A柱上只剩下一个圆盘,我们将这个圆盘从A移动到C(我们所要关心的只有最后将1个圆盘从A移动到C)
步骤3、经过步骤1和步骤2之后,B柱上有了63个圆盘,C上有1个圆盘,我们再通过某种方式将B柱上63个圆盘从B移动到C(同样也不要关心这个具体的方式是什么)
经过了步骤1、 2 、3之后,我们就将所有的圆盘从A移动到了C
在这里插入图片描述

在这里插入图片描述

但是问题又来了,在步骤1中,我们将63个圆盘从A移动到了B,那么我们如何移动呢?
步骤1又可以继续拆分:
步骤1.1、将62个圆盘从A柱移动到C柱
步骤1.2、将1个圆盘从A柱移动到B柱
步骤1.3、将62个圆盘从C柱移动到B柱

步骤1.1又可以继续拆分:
1.1.1、将61个圆盘从A柱移动到B柱
1.1.2、将1个圆盘从A柱移动到C柱
1.1.3、将61个圆盘从B柱移动到C柱
继续向下拆分
.
.
.
经过63次拆分后,第64次只需要移动1个圆盘,只需要将1个圆盘移动到领一个圆盘上即可

我们设一个函数H(n)表示n个圆盘从A柱移动到C柱需要移动多少次
我们要先将(n-1)个圆盘从A移动到B柱,需要移动H(n-1)次
然后将1个圆盘从A移动到C柱,需要移动1次
再讲(n-1)个圆盘从B柱移动到C柱,需要移动H(n-1)次
因此H(n) = 2*H(n-1) +1,H(1)= 1;
我们就得到了递推公式
H(1) =1=2^1-1
H(2)=2(H(1))+1=2^2-1
H(3)=2(H(2))+1=2^3-1
H(4)=2(H(3))+1=2^4-1
.
.
.
H(n)=2^n-1。
所以64个圆盘需要移动2^64-1次,假设1秒移动可以移动1次,差不多需要5845.42亿年以上。

对于最初的三个步骤,可能很多人还是比较迷糊,我们换一个说法,现在小明有一个任务,就是将64个 圆盘从A移动到C,但是他只会移动一个圆盘。于是他找到了小张帮忙,小张欣然接受 ,并保证完成任务,于是小张帮小明把上面的63个圆盘从A移动到B,然后小明再将第64个圆盘移动到C;等小明移动完第64块圆盘之后,再让小张把63个圆盘 从B移动到C。对于小明来说,他不用关心小张是如何做到将63个圆盘从A移动到B,再从B移动到C,他只需要等小张移动完63块圆盘之后,完成第64块圆盘的移动。而小张在进行移动的时候,他可以再找其他人帮助,这些小明都不用关心,同样小张也不用关心他所找的人是如何进行的移动。

我觉得这就像是A公司有一个大项目,A公司将这个项目拆分成了2个部分,将最核心的部分留给自己公司处理,然后将剩下的部分外包给B公司,B公司同样可以像A公司一样,继续往下外包,这样一直下去。只要最后每个公司能保证属于自己的部分完成,那么整个项目就可以顺利的完成。

二、代码实现

#include<stdio.h>void Move_(char From, char Dest)					//移动一个圆盘,将圆盘从来源移动到目的地  从From 移动到Dest 
{printf("将一个圆盘从%c柱子 -> %c柱子\n", From, Dest);
}
void Hanoi( char A,char B,char C,int  n)	//总共有n个圆盘,将这n个圆盘  借助 B 柱子 从 A 柱子移动到  C 柱子
{if (n == 1)								//当只有一个圆盘时,直接圆盘从 A 柱 移动到 C 柱{Move_(A, C);}else  {Hanoi(A,C,B,n - 1);				 //当不只一个圆盘时,我们先将上面 (n -1)个圆盘 借助 C柱子  从 A 柱子移动到 B 柱子Move_(A, C);					//A柱剩余一个圆盘,将剩下的一个圆盘从 A 移动到 CHanoi(B, A, C, n - 1);			//再将(n-1)个圆盘 借助 A柱子 从 B柱子 移动到 C柱子}
}
int main()
{int  n = 0;							//汉诺塔层数char A = 'A';						//A柱子char B = 'B';						//B柱子char C = 'C';						//C柱子scanf("%d", &n);Hanoi(A,B,C,n);						//将n个圆盘,借助于B柱子,从A柱子移动到C柱子return 0;
}

运行结果:
n=3
在这里插入图片描述
n=5
在这里插入图片描述
n=20的时候,我的电脑运行了47秒的时间,根据上面的迭代公式,总共迭代了2^20-1次,≈ 2^ 20次,所以当n=30的时候需要迭代2^30次(减1忽略不计),大概需要
47* 2^10 =48128S,约等于13.37小时,当n=31的时候,大概需要13.37*2小时,约等于1天(我们大胆省略多出来的2个多小时)n=64的时候,需要迭代2^ 64次,大概需要2^33天。额,大概我是等不到那一天的。

总结

理解汉诺塔问题的关键就是要理解它的递归思想,以及只关心自己的任务,分派出去的任务只用关心它最后的结果,至于过程则不要去过多地关注
我的博客中还有一篇关于函数递归的问题:青蛙跳台阶如果有兴趣也可以看看

最后感谢各位的阅读,如果觉得有用,请帮忙点个赞吧


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

相关文章

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)以普通用户登录系统&…

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;人性化的显示…