【C语言】汉诺塔超详解(脑把脑解释)

article/2025/3/11 0:35:24

文章目录

    • 一、前言
    • 二、准备工作
        • 关于递归函数
    • 三、汉诺塔步数计算
          • 详解:函数的设计符合递归函数的两个基本条件:
    • 四、汉诺塔步骤打印(绝对详细,仔细看就能看懂 )
        • 铺垫
        • 换个思路:柱子竟然是可以移动的!我们竟然不能控制圆盘的移动
        • 以num = 3为例

一、前言

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


二、准备工作

关于递归函数

递归函数是一种自己调用自己的函数,在这种函数在解决某些复杂问题中给人们带来方便。
但值得一提的是:函数调用自身的过程中必定存在可使递归调用终止的条件,否则导致出现无限递归。而且,这种函数本质上并不适合人脑使用。因为递归函数具有计算量大,层次深(人工计算容易混乱)
的特点。

递归最重要的两点必须要注意:

一、一定要让递归的函数越来越接近终止条件。如果函数在递归过程中不接近终止条件,那么就会出现无限递归!这个很好理解!
二、结束条件一定要设计好。如果没有设置好合适的结束条件,将会使得计算结果不达预期。


三、汉诺塔步数计算

#include<stdio.h>int hanoi1(int n)
{if(n==1){return 1;}else{return 2*hanoi1(n-1)+1;}
}int main(){int num = 0;int result = 0;printf("请输入圆盘的个数\n");scanf("%d",&num);result = hanoi1(num);printf("%d个圆盘的移动次数为:%d次\n",num,result);return 0;
}
详解:函数的设计符合递归函数的两个基本条件:

一、合适的结束条件(当n的值为1的时候,意味着只有一个圆盘时,直接把圆盘从a柱转移到c柱。只需要一步,所以返回值为1)
请添加图片描述

二、递归的函数越来越接近终止条件(在递归过程中,n不断的减一,知道n==1时,递归函数开始往回折返,最终返回一个确定的值)我们以有三个圆盘来举例:


四、汉诺塔步骤打印(绝对详细,仔细看就能看懂 )

先放代码:

#include<stdio.h>void hanoi2(int n,int a,int b,int c)
{if(n==1){printf("%d->%d\n",a,c);}else{hanoi2(n-1,a,c,b);printf("%d->%d\n",a,c);hanoi2(n-1,b,a,c);}
}int main()
{int num = 0;printf("请输入圆盘的个数\n");scanf("%d",&num);hanoi2(num,1,2,3);
}

关于打印步骤的问题困扰了我很久很久,我看了无数篇文章,也搞不清楚作者想表达什么。
如果想当然的看待问题,确实这个代码很容易理解。比如下面这张图,它想表达什么

		hanoi2(n-1,a,c,b);printf("%d->%d\n",a,c);

有的作者是这样表示的:我们把上面的n-1个圆盘通过c,转移到b,最终的n-1个圆盘落在b的位置上。

那么,我想问:printf("%d->%d\n",a,c) 究竟是把n-1个 a柱子上的圆盘转移到c,还是把a柱子上的圆盘转移到b。如果想表达把a柱子上的n-1个圆盘转移到b,那为什么不写成printf("%d->%d\n",a,b)???

确实,n-1个柱子确实是通过c柱子转移到b柱上,再把最后一个圆盘从A->C。但是,如果这样说,我们将会完全混淆abc到底是柱子,还是柱子上的圆盘这个问题。到底该如何正确看待abc?



作为初学者,我一度百思不得其解。原来,当我们专注于递归问题时,往往会忽略形参和实参的值传递问题。在此之前,我们先做一个铺垫

铺垫

请看下列C程序:

void test(int a,int b,int c)
{if(a==1){printf("%d->%d\n",a,c);}else{test(a-1,c,b);printf("%d->%d\n",b,c);}}int main()
{test(3,1,2);return 0;
}

请告诉我,这个程序会输出怎样的结果?


我们发现,第二行的结果是2->1,也就是当c和b调换位置时,从上一次递归中,b分配到了1,c分配到了2.但是,在输出时,printf中的b依然表示函数定义中的b,而不是函数中显示的b。不懂的人必须在电脑中将程序跑起来,好好理解。


换个思路:柱子竟然是可以移动的!我们竟然不能控制圆盘的移动

一、你眼中程序的圆盘移动
在这里插入图片描述
二、实际上的圆盘移动
在这里插入图片描述


从上面两幅图我们可以看到,所谓的printf("%d->%d"a,c);代表的就是从最左边的柱子移到最右边的柱子,而且只能这么移。我们能做的,就是通过变化函数中abc的位置,达到正确移动的目的。这是上面函数代表的真正意思!

以num = 3为例

具体步骤如下图:
在这里插入图片描述通过这个,我想已经攻克了汉诺塔最难的部分,理解了在函数中abc确实属于柱子,但是我们不能改变移动圆盘的路径,只能不断交换柱子的摆放位置,来达到最终的效果。


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

相关文章

汉诺塔C语言实现

汉诺塔背景 文章目录 汉诺塔背景前言一、什么是汉诺塔&#xff1f;二、汉诺塔问题的背景三、汉诺塔问题的代码实现1.代码原理2.代码实现 前言 汉诺塔问题&#xff0c;是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘&…

C语言汉诺塔详解

问题概述&#xff1a;在A柱子上从下往上按照大小顺序摞着N片黄金圆盘。要求把圆盘从下面开始按大小顺序重新摆放在另一根(B or C)柱子上。并且规定&#xff0c;在小圆盘上不能放大圆盘&#xff0c;在三根柱子之间一次只能移动一个圆盘。 如图所示&#xff1a; (ps&#xff1a;…

C语言实现汉诺塔详细步骤(递归与非递归)及代码

前言 C语言汉诺塔问题是一个经典的问题&#xff0c;在学习编程的初学者中非常流行。它涉及到了递归的思想&#xff0c;能够帮助我们理解递归的基本原理。 首先&#xff0c;我们来了解一下汉诺塔的问题。汉诺塔问题是指&#xff1a;有三根柱子A,B,C&#xff0c;A柱子上有n个盘…

汉诺塔(C语言)

文章目录 一、什么是汉诺塔问题&#xff1f; 二、实现步骤 三、代码实现 四、代码分析 一、什么是汉诺塔问题&#xff1f; 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金…

图文详解汉诺塔(附C语言实现代码)

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;http://a.nxw.so/1iDyQD 一、前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根…

C语言 - 汉诺塔详解(超详细)

文章目录 一、前言二、玩游戏三、汉诺塔打印步数四、汉诺塔打印步骤 一、前言 一、汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下…

汉诺塔问题以及青蛙跳台阶问题(附C语言代码)

汉诺塔问题&#xff1a; 汉诺塔问题的源于印度一个古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照先大后小的顺序摞着64片圆盘。大焚天命令婆罗门把圆盘从下面按大小顺序重新摆放在另一根柱子上&#xff0c;并且规定在小盘…

Mac上显示实时网速小工具

1.iStat Menus 6 功能较丰富&#xff0c;比如你想看大冬天电脑温度等&#xff0c;毕竟Mac本出现过无法充电和无法开机的情况&#xff0c;明明是90多的点&#xff08;自己MBP2018出现过&#xff09; 下载地址&#xff1a;https://bjango.com/mac/istatmenus/ 激活&#xff1a…

在mac上显示网速的软件——iStat Menus 5:

在mac上显示网速的软件——iStat Menus 5: https://bjango.com/mac/istatmenus/ 注册码: Email: 982092332qq.com SN: GAWAE-FCWQ3-P8NYB-C7GF7-NEDRT-Q5DTB-MFZG6-6NEQC-CRMUD-8MZ2K-66SRB-SU8EW-EDLZ9-TGH3S-8SGA 「注册码源于:http://www.pc6.com/mac/111587.html」 转载于…

断点续传

断点续传的实现思路 1、每次一进来&#xff0c;先给总大小和已经下载的大小赋值&#xff0c;判断若不是从头下载&#xff0c;则显示进度条2、暂停的时候&#xff0c;取消请求&#xff0c;并用 NSUserDefaults记录下载的暂停位置&#xff08;客户端记录&#xff09;3、继续下载的…

iStat Menus 无法正常读取传感器温度的解决办法

文章目录 问题解决方式如果是App Store版本&#xff0c;安装插件如果是突然读取不到&#xff0c;尝试重置传感器过滤器重置Mac的SMC使用新版软件 问题 换了电脑之后&#xff0c;像往常一样安装了各种惯用软件。最后发现iStat Menus 没办法读取硬件温度&#xff0c;只能读取到一…

Mac上实时网速、内存等显示

对我这种有强迫症的&#xff0c;要监控各种参数&#xff0c;比如实时网速显示&#xff0c;这里给大家推荐 iStat Menus 1、官网下载 https://bjango.com/mac/istatmenus/ 2、注册码&#xff08;仅供学习研究&#xff0c;误作商业用途&#xff09; xxxx-xxxx-xxxx-xxxx-xxxx…

Mac过热降频的罪魁祸首,竟是插到了左边的Type-C口

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 自从MacBook Pro换成最新设计后&#xff0c;用户的吐槽就没停过&#xff0c;最大的槽点就是那4个Type-C插口。 虽然你今后离不开转接器了&#xff0c;但苹果说4个Type-C更方便&#xff0c;因为可以随便插&#xff0c;每个都可以给…

笔记本计算机左侧插,Mac过热降频的罪魁祸首,竟是插到了左边的Type-C口!

Mac过热降频的罪魁祸首&#xff0c;竟是插到了左边的Type-C口&#xff01; 2020-04-27 19:00:31 2点赞 1收藏 0评论 创作立场声明&#xff1a;长期不正经&#xff0c;独立主观第三方 晓查 发自 凹非寺 鹅板凳 报道 | 公众号 QbitAI 自从MacBook Pro换成最新设计后&#xff0c;用…

Mac常用软件推荐

今天推荐一些Mac上常用的软件&#xff0c;如果你不是开发者&#xff0c;也同样可以安装这些软件&#xff0c;这些软件确实很方便 安装包打不开的问题有时候我们下载下来的安装包双击后打不开&#xff0c;提示来自身份不明的开发者或者提示已损坏&#xff0c;解决办法如下&#…

mac过热_如何阻止Mac过热

mac过热 sergey causelove/Shutterstock.com sergey causelove / Shutterstock.com An overheating Mac is loud, hot to the touch, and often slow or unresponsive. Heat is notoriously bad for computer hardware, so keeping things cool might help prolong the life o…

了不起的全能MAC系统监测工具iStat Menus 5下载

iStat Menus 5 是一款由软件开发商 Bjango 制作的 System Monitor &#xff08;工具&#xff0c;也是笔者电脑里的必装应用之一&#xff0c;它能让用户最快速、最直观地了解到几乎各硬件所有的运行状态&#xff0c;其中包括&#xff1a;CPU 中央处理器、GPU 图形处理器、Memory…

iStat Menus ——mac上显示网速的软件下载地址及注册码

在mac上显示网速的软件——iStat Menus 5: https://bjango.com/mac/istatmenus/ 注册码: Email: 982092332qq.com SN: GAWAE-FCWQ3-P8NYB-C7GF7-NEDRT-Q5DTB-MFZG6-6NEQC-CRMUD-8MZ2K-66SRB-SU8EW-EDLZ9-TGH3S-8SGA 「注册码源于:http://www.pc6.com/mac/111587.html」

iStat Menus 6.51 mac中文版

iStat Menus for mac是一款Mac OS电脑硬件信息检测软件,安装完成后它位于“系统偏好设定”的应用程序面板&#xff0c;让您从选单列监测系统的各项丰富资讯&#xff0c;又不会占用使用者太大的桌面空间&#xff0c;提供的信息包括 CPU 使用情形、内存用量、硬盘使用情形、网络传…

iStat Menus 6 for Mac中文破解版激活方法无需激活码

iStat Menus 6 Mac 中文破解版是Mac OS平台上十分优秀的一款系统与硬件监控软件&#xff0c;通过istat menus for mac 我们可以实时掌握自己的Mac电脑情况&#xff0c;可以查看硬件温度、查看即时网速、显示CPU使用率等等&#xff0c;非常实用。小编现为大家带来istat menus ma…