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

article/2025/3/11 0:21:01

前言

C语言汉诺塔问题是一个经典的问题,在学习编程的初学者中非常流行。它涉及到了递归的思想,能够帮助我们理解递归的基本原理。

首先,我们来了解一下汉诺塔的问题。汉诺塔问题是指:有三根柱子A,B,C,A柱子上有n个盘子,盘子大小不等,且从下到上由小到大排列,现在需要将A柱子上的所有盘子按照同样的顺序移到C柱子上。在移动过程中,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

 

那么,我们来看看如何用c语言来解决这个问题。

使用递归的方法

首先,我们可以使用递归的方法来解决汉诺塔问题。递归的思想是,将一个复杂的问题分解成若干个相似的子问题,递归地求解各个子问题,最终合并各个子问题的解来求解原问题。

我们可以定义一个函数来实现汉诺塔的移动过程。这个函数需要四个参数,分别是盘子的数量n、起始柱子from、结束柱子to、中转柱子temp。

函数代码如下:

void hanoi(int n, char from, char to, char temp)
{if (n == 1){printf("move disk %d from %c to %c\n", n, from, to);}else {hanoi(n - 1, from, temp, to);printf("move disk %d from %c to %c\n", n, from, to);hanoi(n - 1, temp, to, from);}
}

在这个函数中,我们首先判断如果只有一个盘子,那么直接从起始柱子移动到结束柱子即可。如果不止一个盘子,那么我们需要分成两个步骤: - 先将剩下的n-1个盘子从起始柱子移动到中转柱子上,这时候我们就可以使用递归的方法,调用hanoi函数来实现这一步。 - 然后,再将第n个盘子从起始柱子移动到结束柱子上。 - 最后,将中转柱子上的n-1个盘子移动到结束柱子上,这一步同样可以使用递归的方法来实现。

完整的代码如下

#include <stdio.h>void hanoi(int n, char from, char to, char temp) 
{if (n == 1) {printf("move disk %d from %c to %c\n", n, from, to);}else {hanoi(n - 1, from, temp, to);printf("move disk %d from %c to %c\n", n, from, to);hanoi(n - 1, temp, to, from);}
}int main() 
{int n = 3; // 盘子数量hanoi(n, 'A', 'C', 'B'); // 从A柱子移动到C柱子,中转柱子为Breturn 0;
}

通过这段代码,我们就可以解决汉诺塔问题了。

在实际使用中,我们可以通过修改代码中的n变量来控制盘子的数量,进而控制移动的步骤。

使用非递归的方法

除了使用递归的方法,我们还可以使用非递归的方法来解决汉诺塔问题。这种方法不需要使用递归,而是通过循环来实现。

我们可以定义一个整型数组,来存储每一个盘子在哪一根柱子上。每次移动盘子时,我们只需要修改相应的数组元素即可。

代码如下:

#include <stdio.h>void hanoi(int n) 
{int stack[100]; // 存储盘子的柱子for (int i = 0; i < n; i++) {stack[i] = 0; // 将所有盘子放在A柱子上}int step = 0; // 移动的步数int from, to;while (step < pow(2, n) - 1) { // 当移动的步数小于2的n次方减1时,继续移动int from = -1, to = -1;for (int i = 0; i < n; i++) { // 找到第一个非0元素,即第一个盘子的位置if (stack[i] != 0) {from = stack[i];break;}}if (from == -1) continue; // 如果找不到,说明已经完成移动,跳过本次循环for (int i = 0; i < n; i++){ // 找到第一个与from不同的元素,即目标柱子if (stack[i] != from && stack[i] != 0){to = stack[i];break;}}if (to == -1) { // 如果找不到,说明目标柱子为空,可以移动到C柱子上to = 3;}for (int i = 0; i < n; i++) { // 找到第一个非0元素,即要移动的盘子if (stack[i] == from) {stack[i] = to; // 将盘子移动到目标柱子上break;}}step++; // 步数加1}
}int main() 
{int n = 3; // 盘子数量hanoi(n);return 0;
}

通过这段代码,我们就可以使用非递归的方法来解决汉诺塔问题了。不同于递归的方法,这种方法不需要记录递归的层数,因此在某些情况下可能更加简单易用。

总结

在这篇博客中,我们介绍了如何使用c语言来解决汉诺塔问题。我们首先使用递归的方法来解决这个问题,并且通过一段示例代码来说明这种方法的具体实现。然后,我们探讨了另一种非递归的方法,并给出了相应的代码示例。通过这些内容,我们可以更好地理解递归的原理,并在实际的编程中使用递归来解决问题。


http://chatgpt.dhexx.cn/article/6KoejmZw.shtml

相关文章

汉诺塔(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…

istat menus 6

下载地址 安装之后&#xff0c;点击左下角的激活按钮&#xff0c;输入激活信息 Email: 982092332qq.com SN: GAWAE-FCWQ3-P8NYB-C7GF7-NEDRT-Q5DTB-MFZG6-6NEQC-CRMUD-8MZ2K-66SRB-SU8EW-EDLZ9-TGH3S-8SGA 就这样吧

Docker技术文档

Docker技术文档 名词解释什么是虚拟化技术&#xff1f;什么是Docker?Linux容器技术如何理解Docker&#xff1f;Docker在开发和运维中的优势Docker与虚拟机比较Docker不足 总结 Docker的核心概念和安装Docker三大核心概念Docker镜像Docker容器Docker仓库Docker引擎Docker架构 安…

Docker官方文档翻译1

转载请标明出处&#xff1a; https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 个人博客纯净版&#xff1a;https://www.fangzhipeng.com/docker/2018/09/11/docker-trans1.html 本系列教程翻译于docker文档&#xff0c;文档地址&#xff1a;http…