C语言汉诺塔递归算法实现
这是个目录
- 一、什么是递归函数
- 1.先看一下一个递归的例子
- 2.递归的基本原理
- 二、汉诺塔问题
- 1.简要概括一下汉诺塔的故事
- 2.回到编程,汉诺塔问题主要就是解决这个问题:
- 3.怎么解决汉诺塔问题
- 要解决汉诺塔问题就要用到递归思想,这里拿四层汉诺塔举例子:
- 4.具体代码实现
- 在这里可以创建一个move函数来移动盘子
- 现在要把大象装进冰箱了
- 1. 把冰箱门打开
- 2.把大象塞进去
- 3.把门关上
- 5. 完整代码
一、什么是递归函数
函数调用自己的行为就是递归,递归必须要有终止条件,不然它会无限递归。
1.先看一下一个递归的例子
此程序的factorial函数参数从大到小地一级一级地调用自己,直到参数为1,然后函数就开始返回一级一级的从小到大地累乘,然后就计算出number的阶乘了。
#include<stdio.h>
#include<stdlib.h>
int factorial(int num);
int main(void)
{int number=0;int result=0;printf("Calculating factorial: ");scanf("%d",&number);result=factorial(number);printf("The result is %d\n",result);system("pause");return 0;
}int factorial(int num)
{if(num == 1)return 1;elsereturn num*factorial(num-1);
}
2.递归的基本原理
以下是《C Prinmer Plus》对于递归的描述:
- 每级调用都有自己的变量
- 每次函数调用都会返回一次
- 递归函数中位于递归调用之前的语句,均按被调函数的顺序执行。
- 递归函数中位于递归调用之后的语句,均按被调函数相反的顺序执行。
- 虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。
- 递归函数必须包含能让递归调用停止的语句。
我个人认为递归就是把你要干的事情抽象一个成可以有限步数解决的函数,然后某一步解决不了就再调用这个函数,直到可以解决(结束递归的条件)这个问题就返回。
下面再看一个具体的例子来了解递归。
二、汉诺塔问题
1.简要概括一下汉诺塔的故事
汉诺塔由法国数学家爱德华·卢卡斯创造,他曾经编写了一个印度的古老传说:
在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
2.回到编程,汉诺塔问题主要就是解决这个问题:
有A、B、C三根针,A上从小到大放着n层盘子,要从A上所有的盘子移动到C盘上。
条件是一次只能移动一个盘子,无论什么时候小盘子必须在大盘子上面。
汉诺塔问题求的是把盘子从A移到C总共的移动次数是多少。
这是我之前追踪四层汉诺塔运行步骤画的笔记
事实证明,没多大帮助。
要想理解递归必须要放弃理解递归,放弃跟踪全程步骤。
解决问题是计算机的事,你只要明确要把每一步怎么传给计算机,递归两层之间怎么交接,以及递归结束的条件就可以。
3.怎么解决汉诺塔问题
要解决汉诺塔问题就要用到递归思想,这里拿四层汉诺塔举例子:
要完成四层汉诺塔,需要先把第四层盘子从A柱放到C柱,而要把第四层盘子放到C柱,就要把上面三层的盘子放到B柱:
那么要把这三层盘子移到B柱,那么就要先把第三层盘子移到B柱。
要把第三层盘子移到B柱,就要把第二层盘子移到C柱子。
要把第二层盘子移到C柱,就要把第一层盘子移到B柱子。
移动一层汉诺塔到另一个柱不简单吗?
这样子把问题解决了,第四层盘子就可以移动到C柱上了。
然后把剩下的三层汉诺塔也按照上面的思想,就可以移动到C柱上了。
4.具体代码实现
把大象装进冰箱需要多少步
- 把冰箱门打开
- 把大象放进去
- 把冰箱门关上
把汉诺塔放到C柱需要多少步
- 把底层上面的盘子放到B柱
- 把最底层盘子放到C柱
- 把B柱那些盘子放到C柱
抽象一下就是:
- 把n-1层盘子从起点移到暂存区
- 然后把第n层盘子从起点移到终点
- 然后把n-1层盘子从暂存区移到终点
在这里可以创建一个move函数来移动盘子
void move(int pile, char src, char tmp, char dst);
src就是源起点,tmp就是暂存区,dst就是终点
最外层的move函数完成的是把pile层汉诺塔从src经过tmp移动到dst
现在要把大象装进冰箱了
在move函数里面调用move函数来解决之后的问题:
1. 把冰箱门打开
move(pile - 1, src, dst, tmp);
这层move完成的是把pile-1层汉诺塔从src经过dst移动到tmp
2.把大象塞进去
move(1, src, tmp, dst);
这层move完成的是把最底层汉诺塔盘子从src直接移动到dst
3.把门关上
move(pile - 1, tmp, src, dst);
这层move完成的是把pile-1层汉诺塔从tmp经过src移动到dst
每一层move函数都有他自己的起点、暂存区和终点,我们只需要把上一层的起点、暂存区和终点传过去就行了。
5. 完整代码
以下是完整代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX_LEVEL 30//设置最大层数int steps = 0;//steps保存盘子移动次数
void move(int pile, char src, char tmp, char dst);int main(void)
{int levels = 0;printf("输入汉诺塔层数(1~%d):", MAX_LEVEL);scanf("%d", &levels);if (levels > 0 && levels < 30)//判断是否符合层数范围{move(levels, 'A', 'B', 'C');printf("共移动了%d次。\n", steps);system("pause");return 0;}printf("输入范围错误\n");system("pause");return 1;}void move(int pile, char src, char tmp, char dst)
{if (pile == 1)//pile=1问题就好解决了{printf("%c --> %c\n", src, dst);steps++;return;}move(pile - 1, src, dst, tmp);move(1, src, tmp, dst);move(pile - 1, tmp, src, dst);
}
运行结果如下:
C语言汉诺塔递归算法实现相关推荐
- 汉诺塔递归算法/搬金盘的婆罗门 - Python实现
汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习.教学等目的引用.讲授或转载,但需要注明原作者"海洋饼干叔 叔":本文不允许 ...
- 汉诺塔算法 c语言实验报告,C语言汉诺塔算法原理分析与实践
汉诺塔游戏的规则:如下图所示,有三个柱子A,B,C,我们要做的是把A柱的所有圆盘,全部转移到C柱上,转移时遵循的规则如下: 1.每次只能移动一个圆盘 2.所有的大圆盘必须在小圆盘的下面 首先假设只有一 ...
- 汉诺塔递归算法进阶_进阶python 1递归
汉诺塔递归算法进阶 When something is specified in terms of itself, it is called recursion. The recursion give ...
- python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现
汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...
- c语言汉诺塔实验报告,C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那 ...
- c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”
说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...
- python汉诺塔递归算法流程图_python实现汉诺塔的图解递归算法
一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...
- 汉诺塔-递归算法深入理解
汉诺塔算法就3个步骤: 第一,把a上的n-1个盘通过c移动到b: 第二,把a上的最下面的盘移到c: 第三,因为n-1个盘全在b上了. 所以把b当做a重复以上步骤就好了.不过,思考过程还是很痛苦的,难以 ...
- python汉诺塔递归算法_Python文摘:汉诺塔问题与递归算法
历史传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜 ...
- python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...
最新文章
- CPU与内存的那些事
- java游戏开发基础Swing之JRadioButton
- 创建一个对象时,在一个类当中 静态代码块 和普通代码块构造方法 的顺序?
- P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】
- Spring WebClient和Java日期时间字段
- 【转】ABP源码分析四十四:ZERO的配置
- 使用 jQuery Mobile 与 HTML5 开发 Web App (二) —— jQuery Mobile 基础
- Junipre认证必了解产品:juniper Networks SSG550M
- vue踩坑以及自己的解决办法总结,
- java 中== equals hashcode源码剖析
- android 意见反馈功能,【Foodie】App用户反馈整理及后续行动建议
- FZU《C语言程序综合设计》
- Python周刊520期
- 全国哀悼日,CSS如何把整个网页黑白显示
- ORB-SLAM3安装遇到的问题及解决
- 资源汇总 | 墨天轮2021年数据库技术直播回顾
- mac下编译安卓源码
- 炸⾦花棋牌游戏Python
- 【个人小结】一次数据库性能优化问题
- PHP intval() 和 (int) 转换的区别
热门文章
- HCRM医院客户管理系统
- 龙帝国与避风港最新网址
- Mac Air 配置Android开发环境
- linux 进程 清理,Linux僵尸进程清除方法
- html中嵌入flvplayer.swf播放器,播放视频
- 天涯python_用python做了个简易的天涯脱水功能
- Linux + ChromiumOS + ....操作系统资源(持续更新...)
- 树莓派chromium-os系统发布
- 录音软件行业调研报告 - 市场现状分析与发展前景预测
- balabala视频格式转换器