汉诺塔(函数递归)

news2024/12/26 21:51:38

前言
汉诺塔问题是一个经典的数学谜题,也是函数递归的一个经典问题,起源于印度。问题的设定是有三个柱子,第一个柱子上有一组不同大小的圆盘,按照从上到下依次变大的顺序摆放。目标是将所有的圆盘从第一个柱子移动到第三个柱子上,但是在移动过程中必须遵守以下规则:
1,每次只能移动一个圆盘。
2,每次移动时,只能将一个圆盘从柱子的顶端移到另一个柱子的顶端。
3,不允许将大圆盘放在小圆盘的上面。
在了解了规则之后我们该怎么样用函数递归的方式解决它呢?那么话不多说我们现在开始。
在这里插入图片描述
函数递归讲究一种由大化小的思想。
首先我们要定义一个函数hanoi(int n,char pos1 ,char pos2 ,char pos3)
首先n代表有n个盘子,pos1是起始位置,pos2是中转位置,pos3是目的位置。
然后我们在定义一个move函数move(char pos1,char pos2)将pos1的盘子移动到pos2上我们先写一下简单的move函数

void move(char pos1, char pos2)
{
	printf("%c -> %c ", pos1, pos2);
}

在这里插入图片描述
如图分别有三个柱子a,b,c,我们的目的是将a上的n个盘子移动到c上。当n=1时我们可以直接将盘子从a移到c。所以我们先这样写。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	
	}
}

当n不等于1时,我们的主要思想是现将a上的n-1个盘子移动到b上,然后将a上剩余的一个盘子移动到c上。如图。
在这里插入图片描述
那么此时我们要把n-1个盘子从a移动到b,即起始位置是a,目的位置自然是b,那c就是我们的中转位置。那么我们开始写代码。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	hanoi(n-1,pos1,pos3,pos2);//此时pos2是目的位置,pos1是起始位置
	move(pos1,pos3);//将a上的那一个放到c上
	}
}

接下来我们需要把b上的n-1个放到c上,此时我们的b就是起始位置,c是目的位置,而a就是中转位置。如图所示。
在这里插入图片描述
到这里我们发现就完成了任务那么我们再写一下代码。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	hanoi(n-1,pos1,pos3,pos2);//此时pos2是目的位置,pos1是起始位置
	move(pos1,pos3);//将a上的那一个放到c上
	hanoi(n-1,pos2,pos1,pos3);//此时pos2是起始位置,pos3是目的位置
	}
}

这样我们的hanoi函数就写好了下面我们来演示。

#include<stdio.h>
void move(char x, char y)
{
	printf("%c -> %c ", x, y);
}
void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		hanoi(n - 1, pos1, pos3, pos2);//此时pos2是目的位置,pos1是起始位置
		move(pos1, pos3);//将a上的那一个放到c上
		hanoi(n - 1, pos2, pos1, pos3);//此时pos2是起始位置,pos3是目的位置
	}
}
int main()
{
	int n;
	scanf("%d", &n);//输入共有n个盘子
	char a = 'A', b = 'B', c = 'C';
	hanoi(n,a,b,c);
	return 0;
}

输入n=4时结果是这样的
在这里插入图片描述

尾声
关于函数递归经典问题汉诺塔的分享就到这里,如果觉得博主讲的不错请给博主一个赞和收藏鼓励一下博主,关注博主不迷路,我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126/RV1109 ISP调试方案

最近一直在做瑞芯微rv1126的开发&#xff0c;由于项目性质&#xff0c;与camera打的交道比较多&#xff0c;包括图像的采集&#xff0c;ISP处理&#xff0c;图像处理&#xff0c;H.264/H.265编解码等各个方面吧。学到了不少&#xff0c;在学习的过程中&#xff0c;也得到了不少…

Flutter的BuildContext简介

文章目录 BuildContext 简介BuildContext的主要作用 BuildContext 简介 BuildContext是Flutter中的一个重要概念&#xff0c;表示当前Widget在树中的位置上下文。它是一个对Widget树的一个位置的引用&#xff0c;用于查找、访问和操作该位置上的相关信息。每个Widget都有一个关…

家长的责任是什么

我们经常讨论各种话题&#xff0c;包括家长的责任。作为家长&#xff0c;我们的责任不仅仅是抚养孩子&#xff0c;更是塑造他们的未来。那么&#xff0c;家长的责任究竟是什么呢&#xff1f; 为孩子提供一个稳定、和谐的家庭环境。家庭是孩子成长的第一个课堂&#xff0c;家长需…

自激活T细胞为肿瘤免疫治疗提供新思路—高分文献分享

CD28是在所有小鼠和人类T细胞上表达的共刺激受体&#xff0c;用来调节T细胞受体(TCR) 的响应。异常的CD28 信号传导是癌症、自身免疫和病毒感染中T细胞功能障碍的决定性特征之一。早期的一些研究表明CD28对CD4 T细胞更重要&#xff0c;但也有越来越多的研究者发现其对CD8 T细胞…

Java:TCP 通信方法(基本发送 + 接收)并 实现文件传输且反馈

TCP 通信编程 TCP:是一种可靠的网络协议&#xff0c;再通信两端都建立一个Socket对象。 通信之前要保证连接已经建立。 通过Socket产生IO流进行通信。 创建对象时&#xff0c;会连接服务器&#xff0c;连接不上&#xff0c;会报错。 所以&#xff0c;先运行服务端&#xff0c;再…

SCT2632QSTER4.2V-60V Vin,3A,高效、频率可调、降压DCDC转换器

SCT2632Q是一款3A降压转换器&#xff0c;具有宽输入电压&#xff0c;从4.2V到60V&#xff0c;集成了220mΩ高压侧MOSFET。SCT2632Q采用峰值电流模式控制&#xff0c;支持脉冲跳过调制&#xff08;PSM&#xff09;&#xff0c;以帮助转换器在轻负载或待机状态下实现高效率条件。…

逻辑回归原理及代码

逻辑回归原理 线性回归主要用于预测连续的数值输出&#xff0c;基于线性关系模型&#xff0c;其目标是最小化实际值和预测值之间的差异。 逻辑回归主要用于分类问题&#xff0c;尤其是二元分类&#xff0c;它预测属于某一类别的概率&#xff0c;并基于概率输出进行决策&#x…

壹家人温暖宁夏中卫,34个孩子收到壹基金温暖包

这个12月&#xff0c;2023年度壹基金温暖包在宁夏中卫的发放活动顺利开展&#xff0c;镇罗中学的4个孩子和山羊场小学28个孩子领到了这份温暖的冬日礼物&#xff0c;后续还有丰台村2个孩子也会领到这份冬天的礼物。 2023年壹基金温暖包共筹集温暖包34个&#xff0c;经过我们…

数字图像处理(实践篇)二十四 使用dlib实现人脸对齐

目录 1 安装依赖库 2 下载shape_predictor_68_face_landmarks.dat文件 3 人脸对齐方案 4 涉及的函数 5 实践 1 安装依赖库 使用如下命令即可安装dlib: pip install dlib 在使用

AMEYA360:海康存储PCIe4.0固态硬盘A4000介绍

海康存储即将发布PCIe4.0固态硬盘新品A4000&#xff0c;搭载全新定制主控及高品质3D NAND闪存颗粒&#xff0c;最大顺序读取速度达7100MB/s&#xff0c;提供五年质保服务。 2022年&#xff0c;海康存储开始在PCIe 4.0固态硬盘领域全面发力&#xff0c;推出C4000 ECO、C4000等多…

多元统计课程 --整理

第五週 Principal components_哔哩哔哩_bilibili &#xff08;【多变量分析 Multivariate Analysis】台湾交通大学 - 黃冠華 教授&#xff09; 厦门大学多元统计课程-哔哩哔哩视频 (bilibili.com) 杰大大大大大人的个人空间哔哩哔哩视频 (bilibili.com) 【b站数学视频-知乎】…

解决方案-复杂电磁环境适应性试验系统

复杂电磁环境适应性试验系统 简述&#xff1a; 复杂电磁环境适应性试验系统主要用于构建想定场景下的复杂电磁环境&#xff0c;为通信、导航等无线收发设备的设计、开发、试验提供先进的仿真与试验验证评估条件&#xff0c;提高设计建模、在线仿真、半实物仿真验证及评估能力&…

【计算机设计大赛】冬残奥会可视化系统_附源码—信息可视化赛道获奖项目深入剖析【可视化项目案例-19】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

慢SQL的治理经验

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、慢SQL导致的后果 二、可能导致慢SQL的原因 三、如何发现慢SQL 3.1 JVM Sandbox 四、识别高危SQL 4.1 阿里的重点强制SQL规…

多线程案例-定时器(附完整代码)

定时器是什么 定时器是软件开发中的一个重要组件.类似于一个"闹钟".达到一个设定的时间之后,就执行某个指定好的代码. 定时器是一种实际开发中非常常用的组件. 比如网络通信种,如果对方500ms内没有返回数据,则断开尝试重连. 比如一个Map,希望里面的某个key在3s之后过…

MySQL一行记录是怎么存储的?

文章目录 MySQL 一行记录是怎么存储的&#xff1f;MySQL 的数据存放在哪个文件&#xff1f;表空间文件结构 InnoDB行格式有哪些Compact行格式varchar(n) 中 n 最大取值为多少&#xff1f;行溢出后&#xff0c;MySQL是怎么处理的&#xff1f; MySQL 一行记录是怎么存储的&#x…

SpringBoot 这么实现动态数据源切换,就很丝滑!

最近在做业务需求时&#xff0c;需要从不同的数据库中获取数据然后写入到当前数据库中&#xff0c;因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态数据源SpringBoot的starter&#xff1a;dynamic-datasource-spring-boot-starter来实现。 结果引入后发现由于…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程&#xff08;1&#xff09;准备工作-脚本1&#xff09;、准备工作-编写运行脚本文件2&#xff09;、给权限3&#xff09;、运行脚本 &#xff08;2&#xff09;进入q…

亚马逊测评如何安全有效地进行?完整攻略解读

亚马逊测评一直是许多亚马逊卖家快速了解市场、获得评论和提高销售的方法之一。与此同时&#xff0c;亚马逊官方对测评的控制也越来越严格。测评越来越困难&#xff0c;如果操作不当&#xff0c;可能会导致账户被禁等严重后果。 因此&#xff0c;如何安全有效地测评亚马逊已经成…

防职业掉坑必看,电商设计主要做什么?

今年双十一刚结束&#xff0c;各电商平台不公布总销售额的新闻就上了热搜。外行人乍一看可能觉得消费意愿下降&#xff0c;消费水平降级&#xff0c;电商行业不景气&#xff0c;但实际上电商领域在国内突飞猛进了10几年后&#xff0c;仍然还有很大的上升空间。很多人说&#xf…