Hanoi(汉诺)塔问题

news2024/9/25 17:21:20

目录

什么是汉诺塔?

如何分析汉诺塔

代码实现汉诺塔


什么是汉诺塔?

这是一个古典的数学问题,是一个用递归方法解题的典型例子。汉诺塔的故事在这里不做介绍啦!

汉诺塔的思想是:

        总共有3根柱子,这里假设为A、B、C。A上有n个圆盘,圆盘的大小由下到上依次递减,现在我们要把这n个盘子借助B从A移动到C,但是每次只允许移动一个盘,且在移动的过程中在3个柱子上的盘都始终保持大盘在下,小盘在上。

如何分析汉诺塔

实质:将A上的圆盘借助B移动到C。

条件限制:(1)每次只移动一个  (2)小在上,大在下

在这里,我们选取n=3来分析。

(这里假设三个圆盘从上到下标号为123)

Step1:首先, C为辅助,B为目标。将1,2,即n - 1个圆盘移到了B柱上,C 柱为空,A 柱还剩下一个最大的盘子。

将盘子1从A -> C
将盘子2从A -> B
将盘子1从C -> B

在这一步之后,A上有3,B上有12,C为空。

Step2:将最大的盘子移动到了目标柱 C 上

将盘子3从A -> C

在这一步之后,A为空,B上有12,C有3。

两步之后,我们已经成功把3,移动到了我们想要放置的位置。

接下来用相同的方法,把2移动到C上。

Step3:此时 A 为辅助,C 为目标。将1,即n - 1个圆盘移到了A柱上,B柱还剩下一个最大的盘子。

将盘子1从B -> A

在这一步之后,A上有1,B为2,C上有3。

Step4:将当前最大的盘子移动到了目标柱 C 上

将盘子2从B -> C

在这一步之后,A上有1,B为空,C上有23。

又两步之后,我们已经成功把2,移动到了我们想要放置的位置。

Step5:此时 B为辅助,C 为目标。但此时,只剩一个盘子,我们可以直接将盘子移动到C上。

将盘子3从A -> C   

在这一步之后,A为空,B为空,C上有123。 

至此,完成了圆盘的移动。

小结:

        从上面的分析我们可以看出,空的柱子为辅助,且两个步骤为一组(可以将一个圆盘正确的移动到目标柱C上)。于此,我们可以推到n个圆盘,每次借助辅助放置n-1个盘。

        因此,不难看出,汉诺塔的问题本身是一个大问题,我们可以将这个大问题转化为许多个相似的小问题,其解决方案与将一个较小的汉诺塔移动到另一个柱子上的解决方案相似。这里我们就需要用到递归了。

代码实现汉诺塔

#include<stdio.h>

int  main()
{
	void hanoi(int n,char disA,char disB,char disC);  //对hanoi函数进行声明
	int n;
	printf("输入一个整数n表示汉诺塔上圆盘的个数:"); 
	scanf("%d",&n);
	printf("汉诺塔的移动顺序:\n");
	hanoi(n,'A','B','C'); 
	return 0;
 } 
 
void hanoi(int n,char disA,char disB,char disC)
{
	void move(char x,char y);
	if(n==1)  //只剩一个盘子 
	{
		move(disA,disC);  //将A移动到C 
	}
	else
	{
		//将disA上的前n-1个圆盘(即除了最大的那个圆盘之外的所有圆盘)移动到辅助柱子disB上
		//实际上是借助了disC辅助   
		hanoi(n-1,disA,disC,disB);   //Step1 这一步之后,disA上剩一个最大的圆盘n ,disB有n-1个 
		move(disA,disC);            //Step2 我们要将这个最大的圆盘n 移动到disC上 ,这一步之后,disA为空 
		hanoi(n-1,disB,disA,disC);  //Step3  以此递归,将空的disA作为辅助 
	}
}

void move(char x,char y)
{
	printf("%c-->%c\n",x,y);
}

最后我们来总结一下,什么时候会使用到递归思想来解决问题呢?

问题可以自然地分解为与原问题相似规模更小子问题时。同时要注意递归终止的条件。

然而,需要注意的是,递归可能导致大量的函数调用和返回,如果递归深度过大,可能会导致栈溢出等问题。因此,在使用递归时,需要仔细考虑其效率和安全性。

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

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

相关文章

书生.浦江大模型实战训练营——(三)Git基本操作与分支管理

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…

趋动科技荣登「AIGC赋能金融创新引领者TOP20」

2023年11月28日&#xff0c;“极新AIGC行业峰会”在北京召开&#xff0c;峰会以“AI落地”为指引&#xff0c;探究AI实践与产业化。 从制造业到金融服务业&#xff0c;从医疗保健到交通运输&#xff0c;从文化娱乐到消费零售&#xff0c;智能客服、数字人直播、智能巡检机器人&…

RocketMQ5.0课笔记-架构设计

rocketmq云原生架构 rocketmq的可观测性 NameServer服务发现和注册 rocketMQ的负载均衡 rocketmq高可用方案设计

pod的存储卷

容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。其次&a…

【轨物洞见】光伏电站组件满发小时偏差监测分析方案

光伏发电作为一种环保、可再生的能源形式&#xff0c;在全球得到了广泛的应用。然而&#xff0c;与其他发电方式相比&#xff0c;光伏发电的产能与天气条件息息相关。长期以来&#xff0c;人们一直关注光伏满发小时偏差的问题&#xff0c;并不断努力找到解决方案。 光伏满发小时…

C++笔记1•C++入门基础•

1.C关键字 C总计63个关键字&#xff0c;C语言32个关键字&#xff1a; 2.命名空间&#xff1a; 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目…

VSCode学习记录

一、下载相关包 npm install npm install vue-router //路由 npm install axios npm install element-plus --save //组件 二、构建一个简单的项目 1.创建router文件夹&#xff0c;在里面创建一个index.js文件用来管理不同页面的路由 import {createRouter,createWebHashHist…

【virtuoso】ocean脚本生成数据文件

1. 生成的原始脚本文件 点击ADE&#xff0c;Sessionsave Ocean Script (如果是AED Explorer或者 ADE Assembler)点击之后会出现这样选项 第2个选项&#xff0c;保存东西更多。这里选择第一个选项 输出的脚本如图所示 ocean文件 1simulator仿真器选择2design设计文件所在位置3r…

循环依赖问题和Spring三级缓存

产生原因&#xff1a;两个或多个bean之间互相持有对方的引用 解决&#xff1a;spring三级缓存 一级缓存&#xff1a;单例池&#xff0c;存放已经经历了完整的生命周期的bean 二级缓存&#xff1a;存放早期的&#xff0c;还没走完生命周期的bean 三级缓存&#xff1a;存放对…

Linux编译器 gcc/g++使用

目录 0.前言 1.C/C编译链接过程回顾 2.gcc如何完成编译链接 2.1预处理 2.2编译 2.3汇编 2.4链接 3.gcc编译选项 4.函数库 4.1静态库 4.2动态库 5.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在Linux系统中&#xff0c;C/C编程的开发工具不可或缺&#xff0c;其中gcc…

写给非机器学习人员的 embedding 入门

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

合并两个有序数组(LeetCode)

题目 给你两个按 非递减顺序 排列的整数数组 和 &#xff0c;另有两个整数 和 &#xff0c;分别表示 和 中的元素数目。请你 合并 到 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组不应由函数返回&#xff0c;而是…

Word中加载Mathtype后粘贴复制快捷键(Ctrl+C/V)不能使用

操作环境 windows 11操作系统 word版本2021 mathtype版本7.4 这个问题只出现在word中&#xff0c;在excel和ppt中都不存在这个问题&#xff0c;而且之前在另一台电脑中使用word2016版本并没有这种问题的&#xff0c;然后网上搜了一下有不少人有这种问题&#xff0c;word直接取…

nodejs/node-sass/sass-loader三者版本对应关系(已解决)

基本前提&#xff1a;了解版本对应关系 示例&#xff1a; 我的nodejs&#xff1a;v14.21.3&#xff0c; 则package.json: "node-sass": "^4.14.1", "sass-loader": "^8.0.0",扩展&#xff1a; 查看node历史版本&#xff1a; Node.js…

【数据结构-前缀哈希】力扣525. 连续数组

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是…

摸着石头过河的具身智能公司,正在寻求“确定性”

在种种不确定因素之下&#xff0c;对于具身智能&#xff0c;唯一可以确定的是&#xff0c;其未来巨大的市场空间。从纷纷入局的科技巨头、创业公司的市场现状即可窥见一二。而类比到自动驾驶&#xff0c;其也是抛开层层迷雾后才得以在今天看见曙光。 相信&#xff0c;于具身智…

高效报销管理:领先软件的综合评测

本文主要介绍了以下10款报销管理软件&#xff1a;合思、明道云、汇联易、畅捷通、慧算账、云之家、Ramp、Nexonia by Emburse、Rydoo、Expensify。 在处理财务报销时&#xff0c;你是否经常感到手续繁琐、效率低下&#xff1f;选择合适的软件系统&#xff0c;能够显著优化整个报…

亚信安全以安全守护的“星座”正闪耀太空

近日来&#xff0c;一个Made in China的“星座”闪耀太空&#xff0c;受到世界瞩目。“千帆星座”计划&#xff0c;首批18颗商业组网卫星成功发射升空&#xff0c;目前已顺利进入停泊轨道&#xff0c;见证了我国卫星互联网发展的重要时刻&#xff0c;未来将开启面相全球用户的低…

模块化叙事的演变:DeFi借贷开发的模块化转型

随着区块链技术的不断发展&#xff0c;去中心化金融&#xff08;DeFi&#xff09;正经历一场深刻的变革。模块化借贷作为这一变革的重要部分&#xff0c;正逐渐成为加密金融领域的焦点。本文将探讨模块化借贷的起源、演变及其未来发展方向。 一、模块化的起源 模块化区块链的概…

5.2二叉树的概念

5.2.1二叉树的定义 二叉树特点: ①每个节点最多只有两颗子树 ②二叉树的子树有左右之分,不能随意颠倒 ③二叉树为有序树 几种特殊的二叉树 满二叉树 除叶节点之外的每个节点度数均为2 对于编号i的节点,若有双亲,则双亲为i/2-向下取整 若有左孩子,则为2i;若有右孩子则为…