递归经典例题 --- 汉诺塔(图文详解)
目录
一、介绍
二、游戏规则
三、玩法简介
四、算法分析
五、代码解析
六、源码
七、递归过程详解
一、介绍
汉诺塔(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("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);}else{Hanno_Tower(n - 1, A, C, B);//将n-1个盘子,从A绕过C移动到Bprintf("将编号为%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("将编号为%d的盘子从%c柱子移动到%c柱子上\n", n, A, C);}else{Hanno_Tower(n - 1, A, C, B);//将n-1个盘子,从A绕过C移动到Bprintf("将编号为%d的盘子从%c柱子移动到%c柱子上\n", 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时,程序是否能打印以上结果呢?
显然符合我们的预期!!
递归经典例题 --- 汉诺塔(图文详解)相关推荐
- Tower of Hanoi(汉诺塔)详解
一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下.话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内 ...
- 汉诺塔python创新设计_递归经典案例汉诺塔 python实现
最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...
- 汉诺塔问题详解 递归实现 C语言
目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子, 其中一根柱子 ...
- c语言中的汉诺塔问题详解
汉诺塔问题是一个古典的数学问题,也是c语言学习中一个用递归方法解题的典型实例,我们先看一下原题. 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A ...
- python之汉诺塔问题详解
#汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- 算法 汉诺塔-java详解
第一次看到这个算法时,很懵逼,是在栈那里.想了半天没想到半点跟栈有关系的解法.最后看了答案,是用的递归.但是看了答案还是很懵逼,下面就是博主自己对汉诺塔的一些了解. 有三根木桩,第一根上有n个盘子,最 ...
- QT汉诺塔项目详解:多线程动画
关注QT坐标,多线程动画中坐标的变化.汉诺塔都是吃要的. 我的汉诺塔新解:一种更美的描述. http://blog.csdn.net/weixin_39788534/article/details/7 ...
- 走进递归经典——汉诺塔问题详解
目录 传统艺能
- 递归(二)-------经典递归实例(汉诺塔问题)
2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章讨论一个经典的递归实例(Fibonacy数列问题),现在来讨论一下另外一个经典的递归例子:汉诺塔问题: 问题描述:在 ...
最新文章
- 2019年中国企业级SaaS行业研究报告
- 洪小文: 今天的AI只是一个黑盒,仍需与HI密切配合
- MySQL 优化实战记录
- JStorm与Storm源码分析(三)--Scheduler,调度器
- Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏
- LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
- 广西师范大学计算机调剂难吗,2014年广西师范大学考研调剂过来人给的建议
- UDP内网和外网连接通信的问题
- java导出数据透视表_使用数据库中的Java流制作数据透视表
- ecplice中class.forname一直报错_A6v5.1升级A6v7.0报错:调用Java代码
- c语言EOF0x99,C语言选择题99道.doc
- 安装JDK后,未设置Path,也能执行java.exe的原因
- TypeSDK免费手游多渠道SDK接入方案
- [置顶] Embedded Server:像写main函数一样写Web Server
- Activiti 工作流表单设计及开发
- viper4android脉冲样本,v4a脉冲反馈样本官方版
- 【122天】尚学堂高琪Java300集视频精华笔记(43-46)
- 3月16日----3月20日一年级课程表
- \U672a\U77e5\U9519\U8bef 字符还原
- matlab求两向量夹角_【求精干货】高中数学知识点总结归纳高一学生必须掌握