C语言(CED)递归实现汉诺塔问题

一、问题大意

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?(百度百科)现要求写出一个代码,表明移动圆盘的过程。

二、大致思路

 递归的问题不用想的很复杂,这道题目在思考起来,应该从最后的结果入手:除最小的圆盘外,其他的圆盘已经在第三根柱子上了,而且按照从小到大的顺序排列着,现在只需要将最后一个并且是最小的圆盘移到第三根柱子上就大功告成了。

我的代码是用A、B、C三个字母代表三根柱子,A->B表示从把A的圆盘移到B上。既然是递归,那么就得思考一下递归到何时,递归终止。要说终止,上文已经说了,最小的那一个圆盘落在第三根柱子上就终止了。也就是n等于1时终止,那么具体的移动过程是一个什么样的思路呢?

假设:

我们已经拥有了解决这个问题的函数hannuota(int n,char A,char B,char C)

a、那么,依照上述绿色的文字,我们需要把n-1个圆盘通过C移动到B后,最大的那一个圆盘才能移动到C上,所以就有:

hannuota(n-1,A,C,B); 

b、然后显示A->C上"printf("%c->%c\n",A,C);"这里看似是A->C,其实是由传递到A、C对应位置的参数确定的,所以也就可以输出移动过程。(我觉得这是本题最巧妙的存在)

b、最大的圆盘移动到C上之后,B上的剩余的圆盘需要借助A移动到C上。所以就有:hannuota(n-1,B,A,C)

 这样就解决问题啊!

三、具体实现

#include<stdio.h>
#include<stdlib.h>
int hannuota(int n, char A, char B, char C)//用大写的ABC代替汉诺塔的三根柱子
{if (n == 1)printf("%c->%c\n", A, C);    //当n=1时,直接把盘子从A移动到C,//也是递归终止的条件else{hannuota(n - 1, A, C, B);            //把A的n-1个盘子通过C移动到Bprintf("%c->%c\n", A, C); //显示从A移动到C的所有的圆盘的过程,因为传参的不同//所以可以显示过程hannuota(n - 1, B, A, C);            //把B上面的n-1个盘通过A移动到C}return 0;
}int main()
{printf("请输入汉诺塔的层数:\n");int n;scanf("%d", &n);printf("汉诺塔移动过程:\n");hannuota(n, 'A', 'B', 'C');system("pause");return 0;
}

四、实验结果 

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

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

相关文章

C语言(CED)智力大冲浪——贪心算法第一题

一、题目大意 小伟报名参加中央电视台的智力大冲浪节目&#xff0c;本次挑战赛吸引了众多参赛者&#xff0c;主持人为了表彰大家的勇气&#xff0c;先奖励每个参赛者m元。先不要太高兴&#xff01;因为这些钱还不一定都是你的&#xff01;接下来主持人宣布了比赛规则&#xff…

C语言(CED)钢条最优切割收益

目录 一、题目大意 二、大致思路 三、具体实现 一、题目大意 一家公司购买长钢条&#xff0c;将其切割成短钢条出售&#xff0c;切割本身没有成本&#xff0c;长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。提示&…

撰写paper时,如何在word里输入图片或其他文献(PDF)里的公式?(更新时间2022.03.01)

我们在写paper时&#xff0c;经常会遇到在Word里编写数学公式的问题&#xff0c;其中大多数公式是已经存在的&#xff0c;所以只需要识别、复制、粘贴即可&#xff0c;那么接下来&#xff0c;我就介绍一下“Mathtype”“Mathpix”的方法&#xff0c;分为所需软件、软件操作、公…

家里接入某运营商300M宽带,为何网速还是很慢?(还未装修房屋的请进来)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 引言&#xff1a;家里接入300M的宽带&#xff0c;但是自我感觉网速不佳&#xff0c;遂结合所学知识&#xff0c;对此问题进行分析、研究和调察&…

(CED)列指针与行指针的联系与区别

一、列指针&#xff08;竖为列&#xff09; 1、列指针相关定义 列指针&#xff1a;被称为是指针变量指向二维数组的某个元素 一般使用时会有如下定义&#xff1a; int a[3][4]{1,2,3,4,5,6,7,8,9,10,11,12}; int *p;而上述代码定义的指针p&#xff0c;一般按照下表方式指向…

一、Pytho第一课——Python安装及配置路径方法(最详细小白教程,没有之一。如若不懂,不是还可以私信嘛!对吧?)

目录 一、下载软件 二、安装 三、编辑器 四、在Pycharm上成功运行Python程序&#xff08;配置Python解释器&#xff09; 一、下载软件 官方下载地址&#xff1a;https://www.python.org/downloads/&#xff08;打开似乎很吃力&#xff0c;必要时刻“挂灯”&#xff09; …

二、Python第二课——变量命名规则及字符串变量相关函数

目录 一、变量命名规则 二、字符串变量及相关函数 1、字符串变量 2、相关函数 最后琐碎杂物&#xff1a; 1、字符串之间的拼接 2、字符串格式控制&#xff08;制表符和换行&#xff09; 一、变量命名规则 正如其他编程语言一样&#xff0c;程序离不开声明变量&#x…

三、Python第三课——Python中数字的用法及编码原则(Python禅意)

目录 一、Python中的数字 1、整数 2、浮点数 3、整数、浮点数和字符串的联系和区别 二、编码原则 1、为代码增加注释 2、Python 禅意 A、编码精美 B、避繁就简 C、无简就繁 D、使用常规方法解决问题 E、先有效、再精巧、逐步升华 一、Python中的数字 编程中&#…

四、Python第四课——Python中列表及其操作(增删改查)

目录 一、Python中的列表 1、列表的定义和赋值 2、列表的使用 二、列表的“增删改查” 1、列表中元素的增加 A、在列表尾添加元素 B、在列表中插入元素 2、列表中“元素的删除” A、使用del语句删除元素 B、使用pop()函数删除元素 C、弹出列表中任何位置元素…

五、Python第五课——Python中组织列表的相关函数

目录 一、用sort()函数对列表进行永久排序 二、用sorted()函数对列表进行临时排序 三、用reverse()函数对列表进行列表原始排序的逆序输出 四、使用len()函数确定列表长度 创建列表后&#xff0c;内部的元素逐渐增多&#xff0c;其排列顺序也是无法预测的&#xff0c;因为…

如何正确下载、安装Codeblocks?

目录 一、Codeblocks的下载 二、Codeblocks的安装 三、Codeblocks的运行 相信很多同学在初学C语言时都会选择一个短小精悍的代码编辑器&#xff0c;如CodeBlocks&#xff08;不说别的了&#xff0c;直接切入正题&#xff09;。 在2020年&#xff08;今年&#xff09;3月份-…

Python:创建列表,其中包含数字1-1000000,为什么Pycharm控制台结果显示不完整?

目录 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 二、解决办法 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 在学习Python过程中遇到一个这样的问题&#xff0c;也算是一个小BUG吧。题目大意是这样的&#xff…

六、Python第六课——Python中的for循环及数字列表

目录 一、Python中的for循环 1、for循环语句的声明。 2、for循环缩进常见问题 二、数字列表 1、函数range() 2、使用range()函数创建数字列表 3、使用一系列函数处理数字列表&#xff08;统计&#xff09; 4、列表解析&#xff08;生成列表的简洁方法&#xff09; 一…

七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)

目录 一、切片 二、遍历切片 三、列表的复制 一、切片 此前&#xff0c;我们学习了如何访问单个列表以及如何处理列表中的所有元素&#xff0c;那么我们如何处理列表中的部分元素呢&#xff1f;这就引出一个概念“切片” 。我们可以把列表看成是面包&#xff0c;“切片”…

八、Python第八课——元组与列表、代码格式

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 一、元组的定义 二、元组的遍历 三、代码格式 一、元组的定义 1、元组&#xff1a;不可变的列表称为元组。这个是相对于普通列表而言的&#xff0c;普通列表…

九、Python第九课——Python中的if语句与运用

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 一、if语句 1、检查变量存储的值是否相等 2、判定字母或字符串时区别大小写 3、检查多个条件 4、检查特定值是否在列表中 二、if-else语句和if-elif-el…

十、Python第十课——字典的些许知识(重点)

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 目录 &#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 初识字典 1、创建字典 2、字典的“增删改查” …

百度地图API如何申请?(自认为比较详细,如解决了你的问题请收藏、点赞、关注)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 注意&#xff1a;自己申请的AK要保存好&#xff0c;最好不要外借&#xff0c;避免不必要的麻烦&#xff01;&#xff08;写在前面&#xff09; 目…

PythonPyqt5项目开发完成后如何使用pyinstaller打包——以Pycharm编辑器为例(目前为止最正确的版本,成功打包日期为2020.11.26)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 最近用Python开发了一个可视化界面&#xff0c;开发过程如鱼得水&#xff0c;几乎没有BUG出现&#xff08;项目简单&#xff09;。但是在临近交付时…

十一、Python第十一课——用户输入和另一种循环(While)

&#xff08;请先看置顶博文&#xff09;https://blog.csdn.net/GenuineMonster/article/details/104495419 学了这么久的Python&#xff0c;大家肯定会好奇&#xff0c;不是说机器学习吗&#xff1f;不是人机交互吗&#xff1f;不是人工智能吗&#xff1f;怎么我学了Python都十…