递归经典例题 --- 汉诺塔(图文详解)

news2024/11/23 13:47:49

目录

一、介绍

二、游戏规则

三、玩法简介

四、算法分析

五、代码解析

六、源码

七、递归过程详解


一、介绍

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

                                                                                                                             ---- 摘抄百度

二、游戏规则

把A杆上的盘子全部移到C杆上,并仍保持原有顺序叠好。

操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下小盘在上,操作过程中盘子可以置于A(起始柱)、B(辅助柱)、C(目标柱)任一杆上。 

三、玩法简介

假设有三个盘子,全部都要移动到C(如下图)

 根据汉诺塔的游戏规则,首先需要把3号盘子和2号盘子分别向B和C移动(如下图)

 接着把3号盘子移动到B,再1号盘移动到C,此时最大的盘子已经到C的底部了(如下图) 

 接着把3号盘子移动到A,然后把2号盘子移动到C(如下图)

最后把3号盘子移动到C(如下图),游戏就成功了!

四、算法分析

假设有n个盘子,来分析其规律

①当n = 1时,A只有1个盘子,可以很轻易地将它移动到C上

②当n = 2时,A有2个盘子

其移动过程,先把A中2号盘子移动到B中暂存

 再把A中1号盘子移动到C

 最后把B中2号盘子移动到C

③ 当n = 3时

玩法简介讲过了。

总结:

通过分析以上三种情况的移动思路,小伙伴发现一个规律没有,对于n个盘子的汉诺塔问题,移动圆盘的过程是:

1.都是将起始柱(A)上的n-1(除最大盘子外)个圆盘移动到辅助柱(B)上。  

2.再将起始柱(A)上遗留的(最大盘子)1个圆盘移动到目标柱(C)上。  

3.最后将辅助柱(B)上所有的圆盘移动到目标柱(C)上。        

要解决n层汉诺塔,就必须解决n-1的汉诺塔。由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题,把一个复杂的问题简单化,这就是递归

五、代码解析

首先写出主函数的内容

#include <stdio.h>
int main()
{
	
	int n = 0;//n代表盘子个数
	//输入盘子的个数
	scanf("%d", &n);
	//写出函数
	Hanno_Tower(n, 'A', 'B', 'C');
	return 0;
}

根据上面的总结分析

调用函数部分:

当n=1时,直接移动到C(目标柱)就行了

void Hanno_Tower(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);
	}
}

当n>1时,首先要把起始柱(A)上的n-1(除最大盘子外)个圆盘移动到辅助柱(B)上

这时就要再次调用Hanno_Tower函数

void Hanno_Tower(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);
	}
	else
	{
		Hanno_Tower(n - 1, A, C, B);//将n-1个盘子,从A绕过C移动到B

	}
}

再将起始柱(A)上遗留的(最大盘子)1个圆盘移动到目标柱(C)上

void Hanno_Tower(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("% c-> % c\n",A, C);
	}
	else
	{
		Hanno_Tower(n - 1, A, C, B);//将n-1个盘子,从A绕过C移动到B
		printf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);//将起始柱上遗留的1个圆盘移动到目标柱上
	}
}

最后将辅助柱(B)上所有的圆盘移动到目标柱(C)上。 

void Hanno_Tower(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("% c-> % c\n",A, C);
	}
	else
	{
		Hanno_Tower(n - 1, A, C, B);//将n-1个盘子,从A绕过C移动到B
		printf("% c-> % c\n",A, C);//将起始柱上遗留的1个圆盘移动到目标柱上
        Hanno_Tower(n-1, B, A, C);//把在B中剩余的n-1个盘子,从B绕过A移动到C
	}
}

六、源码

#include <stdio.h>
void Hanno_Tower(int n, char A, char B, char C)
{
	if (n == 1)
	{
		printf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);
	}
	else
	{
		Hanno_Tower(n - 1, A, C, B);
		printf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);
		Hanno_Tower(n - 1, B, A, C);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Hanno_Tower(n, 'A', 'B', 'C');
	return 0;
}

七、递归过程详解

假设只有2个盘子

n = 1继续调用函数,但这里要注意,图三n = 1时,此时char A存放的是A, char B存放的是C,char C存放的是B,执行if语句,所以首先会先打印“将编号为1的盘子从A柱子移动到B柱子上”

接下来开始回归(红线)

n = 2 ,接下来会在屏幕上打印“将编号为2的盘子从A柱子移动到C柱子上”

最后调用Hanno_Tower(n - 1, B, A, C);接下来继续用图来帮助大家分析

  如图三所示,n = 1,执行if语句,此时char A存放的是B,char B存放的是A,char C存放的是C,所以最后就会打印“将编号为1的盘子从B柱子移动到C柱子上”

所以当n = 2时,程序是否能打印以上结果呢?

 显然符合我们的预期!!

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

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

相关文章

为什么面试官狂问八股文?我已经被三家公司问到哑口无言……

秋招刚过去&#xff0c;整体的感受是&#xff1a;面试难度和拿 offer 的难度比往年难多了&#xff0c;而且互联网还有较大的裁员风险&#xff0c;网上各种消息不断&#xff0c;有时候真是焦虑到不行。 大家还是要早做准备&#xff0c;多面试积累经验&#xff0c;有些人总想准备…

蓝牙技术|蓝牙标准将迈向 6GHz 频段,蓝牙技术迈向新台阶

蓝牙特别兴趣小组&#xff08;SIG&#xff09;今天宣布了新的规范开发项目&#xff0c;以定义蓝牙低功耗&#xff08;LE&#xff09;在额外的非授权中频段的操作&#xff0c;包括 6GHz 的频段。蓝牙技术是世界上部署最广泛的无线标准&#xff0c;每年有超过 50 亿件产品出货。其…

实验五可编程并行接口8255

目录一、实验目的二、实验内容三、实验报告四、运行结果一、实验目的 通过实验&#xff0c;掌握8255工作方式的设定及并行口输入输出的方法。 二、实验内容 电路连接&#xff1a; C口&#xff08;PC0~PC7&#xff09;⟺⟺逻辑电平开关&#xff08;K0~K7&#xff09; PC0⟺K0…

HTML5响应式网页设计——核心技能考核示例(用于2022年11月H5考核)

目录 基础Base.css引入(5分) Base.css编码 项目关键词注释&#xff1a;(5分) 网页框架&#xff1a;(30分) 框架编码&#xff1a; 文字填充&#xff1a;(20分) 文字编码&#xff1a; banner部分(10分) banner编码&#xff1a; 列表部分(20分) 列表编码&#xff1a; …

单商户商城系统功能拆解31—营销中心—幸运抽奖

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

替换NAS,这5个理由就够了

全球数据量爆炸性增长&#xff0c;企业对于大容量、易扩展、低成本的存储设备产生了强烈的需求&#xff0c;起初很多企业选择NAS&#xff0c;但随着企业使用场景多样性&#xff0c;对于存储设备上不再局限于存储&#xff0c;更强调安全和协作能力。 NAS相当于私有云部署的个人…

SAP AIF BTI750

第一章 AIF&#xff08;Application Interface Framework&#xff09;简介 AIF是什么&#xff1f;做什么用的&#xff1f; 功能简介 这样图很清楚的说明了AIF是什么&#xff0c;它是一个技术框架&#xff0c;它可以实施接口并且监控接口&#xff0c;以及解决消息处理期间出…

Java 垃圾收集器

堆内存示意图 垃圾收集算法 1.标记-清除算法 算法分为标记和清除两个阶段。标记出所有需要回收的对象&#xff0c;在标记完成后&#xff0c;统一回收。 缺点&#xff1a; 执行效率不稳定&#xff0c;若堆中有大量对象要被回收&#xff0c;这是必须进行大量标记和清除动作&a…

Push-Relabel算法相关阅读

Push-Relabel算法相关阅读1.Push-Relabel算法思想2.Push-Relabel算法原理示意图3.Push-Relabel算法具体实例4. 网络流各类算法简单总结与比较5. Push-Relabel 预流推进算法6. Push-Relabel算法(最大流)1.Push-Relabel算法思想 对于一个网络流图: 该算法直观可以这样理解&#…

java乱码问题一次性解决

在我们编码生活中&#xff0c;最常见的就是乱码&#xff0c;我也是遇到好几次&#xff0c;现在我整理一下所有乱码的解决方式&#xff0c;可治99%乱码问题 设置文件编码属性 修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 -Dfile.encodingUTF-8 IntelliJ IDEA 中自定义…

AntDB入选《2022爱分析·信创厂商全景报告》

近日&#xff0c;AntDB数据库成功入选《2022爱分析信创厂商全景报告》信创数据库全景地图。报告综合考虑企业关注度、行业落地进展等因素&#xff0c;遴选出在信创市场中具备成熟解决方案和落地能力的厂商。 图1 AntDB数据库入选证书 报告指出&#xff0c;数据库作为企业存储、…

​力扣解法汇总790. 多米诺和托米诺平铺

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如…

dubbo:docker安装dubbo-admin、zookeeper

0.引言 我们在搭建dubbo框架时&#xff0c;需要安装一个dubbo-admin来管理服务已经配置文件&#xff0c;今天我们来看看如何通过docker快速搭建一个dobbo-admin 1. 安装 1、首先到dockerhub上搜索dubbo-admin的镜像源 2、可以看到两个引用较高的镜像源&#xff0c;第一个是a…

了解区块链延迟和吞吐量

大家鲜少提到如何正确地测量一个&#xff08;区块链&#xff09;系统&#xff0c;但它却是系统设计和评估过程中最重要的步骤。系统中有许多共识协议、各种性能的变量和对可扩展性的权衡。 然而&#xff0c;直到目前都没有一种所有人都认同的可靠方法&#xff0c;能够让人进行…

Java#11(字符串练习)

目录 一.遍历字符串 1.public char charAt(int index): 根据索引返回字符 2.public int length(): 返回此字符串的长度 3.数组的长度:数组名.length 4.字符串的长度: 字符串对象.length() 二.统计字符个数 前提基础了解: 三.反转字符串 如何思路清晰的定义方法? 一.遍…

力扣(LeetCode)891. 子序列宽度之和C++)

数学推理 贡献法 由题意可知&#xff0c;子序列的内部顺序不影响宽度&#xff0c;所以可以对子序列排序。得到正序序列。 如 1234561~2~3~4~5~61 2 3 4 5 6 &#xff0c; 序列中数字 444 的下标 i3i3i3 &#xff0c;对于数字 444 &#xff0c; 最大值为 444 的子序列个数为 2…

Web前端开发技术课程大作业——HTML5旅游景区景点(13页面)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

A-Level经济例题解析及练习Computing MPL and VMPL

知识点&#xff1a;Computing MPL and VMPL例题&#xff1a; Question: Computing MPL and VMPL P $5/bushel. Find MPL and VMPL, fill them in the blank spaces of the table. Then graph a curve with VMPL on the vertical axis, L on horizontal axis.解析&#xff1a;…

891. 子序列宽度之和(每日一难phase3-4)

891. 子序列宽度之和 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums &#xff0c;返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大&#xff0c;请返回对 109 7 取余 后的结果。 子序列 定义为从一个数组里删除一些&…

简单工厂模式、工厂模式、抽象工厂模式和加入反射、配置优化后的抽象工厂模式之间的关系和区别

通过两张图简单解释一下什么是简单工厂模式、工厂模式、抽象工厂模式 简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种…