C语言递归函数与汉诺塔问题简明理解
目录
- 递归函数
- Hanio(汉诺塔)问题
递归函数
直接或者间接调用函数本身。“自己调用自己”
什么情况下面可以使用递归呢?
解决一个问题时,解决思路化成与问题本身类似的问题时,“递归”
是不是所有的递归问题,C语言都能支持呢?
不是的
C语言能够解决的递归问题,必须要满足两个条件:
(1) 问题本身一个递归问题。
(2) 递归不能是无限递归
适合那些递归到一定程度时,答案是显而易见的。
一定需要有一个“跳出无限递归的条件”。
C语言是如何支持递归呢?
int age(int n) //从425行开始,定义了一个标识符 age //age就表示求第n个人的年龄 { if(n > 1) { return age(n-1)+2; } else if(n == 1) { return 10; } }
Hanio(汉诺塔)问题
按照Hanio的规则,把n个盘子从A柱移动到C柱上面去,
中间可以利用B柱,需要将其移动的步骤打印出来。
a、确定函数名
Hanio : 一旦被确定,表示 按照Hanio的规则,把n个盘子从A柱移动到C柱上面去,中间可以利用B柱,需要将其移动的步骤打印出来。
b、确定参数
int n , char A , char B , char C
有多少个盘子
从哪里移 起点 A
移到哪儿去 终点 C
中间可以利用 中转站 B
c、确定返回值的类型 无
d、代码、算法具体实现
void Hanio(int n, char A, char B , char C) { if(n == 0) { return ; } //1.想办法(Hanio),把n-1个盘子从A柱移动到B柱,中间可以使用C柱 Hanio(n-1, A ,C , B); //2.直接将最后那个盘子,从A柱移动到C柱 printf("%c -> %c\n", A , C); //3.想办法(Hanio),把n-1个盘子从B柱移动到C柱,中间可以使用A柱 Hanio(n-1, B ,A , C); }
求斐波拉契数列的前n项和
//Get_N : 表示求斐波拉契数列的第n项元素的值 int Get_N(int n) { if(n == 1 || n == 2) { return 1; } return Get_N(n-1) + Get_N(n-2); } //sum_fei: 求斐波拉契数列的前n项和 //思路: //先求前面的n-1的和,再加上最后一项元素的和 int sum_fei(int n) { if(n == 1) { return 1; } return sum_fei(n-1) + Get_N(n); }
到此这篇关于C语言递归函数与汉诺塔问题简明理解的文章就介绍到这了,更多相关C语言递归函数 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C语言深入分析递归函数的实现
目录 一.递归的数学思想 二.递归函数 三.递归函数设计技巧 四.递归函数设计示例一 五.递归函数设计示例二 六.递归函数设计示例三 七.小结 一.递归的数学思想 递归是一种数学上分而自治的思想 递归需要有边界条件 当边界条件不满足时,递归继续进行 当边界条件满足时,递归停止 递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理. 二.递归函数 函数体内部可以调用自己 递归函数 函数体中存在自我调用的函数 递归函数是递归的数学思想在程序设计中的应用 递归函数必须有递归出口 函数的无限递归
-
C语言的递归函数详解
目录 函数递归 什么是递归? 递归的俩个必要条件 代码引例1 栈溢出(Stack Overflow) 合理使用递归 代码引例3 代码引例4 解释要合理使用递归 总结 函数递归 程序调用自身的编程技巧称为递归 recursion) 函数自己调用自己就是递归 你也可以理解成是一种嵌套结构,但递归分为俩部分,第一是“递”,进入嵌套结构.第二是”归“,最终会一步一步返回.第一次接触递归都会很懵,慢慢理解这个过程就明白了. 什么是递归? 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或
-
C语言实现汉诺塔(图文详解)
目录 思路: 当n=1时: 当n=2时: 当n=3时: 当n=4时: 见代码 运行截图 总结 汉诺塔的游戏规则: 有三根金刚石柱子A.B.C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环.大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环. 即将A柱子上全部的环通过中间柱子B(B柱子作为中介)移动到C柱子上 当A只有一个环的时候: A->C 当A只有两个环的时候: A->B A->C
-
C语言编程递归算法实现汉诺塔
汉诺塔 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 这个传说挺有意思的,这个传说
-
C语言用递归函数实现汉诺塔
目录 汉诺塔(Hanoi)是什么? 那么,C语言如何实现汉诺塔呢? 汉诺塔的基本思路是: 具体代码见下(注意点在代码下面): 总结 汉诺塔(Hanoi)是什么? 一个简单的汉诺塔就如上图所示,有三个放置点,放置物必须遵循上小下大的规则,依次将1中的放置物全部放置到3中.就比如该图中有4个放置物,若将A上的放置物全部移至C上,具体的步骤是:A->B A->C B->C A->B C->A C->B A->B A->C B->C B->A C->
-
C语言编写汉诺塔游戏
目录 汉诺塔的游戏规则: 当A只有一个环的时候: 当A只有两个环的时候: 当A只有三个环的时候: 思路: 当n=1时: 当n=2时: 当n=3时: 当n=4时: 见代码 运行截图总结 汉诺塔的游戏规则: 有三根金刚石柱子A.B.C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环.大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环. 即将A柱子上全部的环通过C柱子(C柱子作为中介)移动到B柱子
-
C语言递归函数与汉诺塔问题简明理解
目录 递归函数 Hanio(汉诺塔)问题 递归函数 直接或者间接调用函数本身.“自己调用自己” 什么情况下面可以使用递归呢? 解决一个问题时,解决思路化成与问题本身类似的问题时,“递归” 是不是所有的递归问题,C语言都能支持呢? 不是的 C语言能够解决的递归问题,必须要满足两个条件: (1) 问题本身一个递归问题. (2) 递归不能是无限递归 适合那些递归到一定程度时,答案是显而易见的. 一定需要有一个“跳出无限递归的条件”. C语言是如何支持递归呢? int age(int n) //从425
-
JavaScript递归函数解“汉诺塔”算法代码解析
"汉诺塔"是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把交大的圆盘放置在较小的圆盘之上. 仔细解读这段话,如果有10个圆盘甚至更多,那操作步骤绝对多到让人震惊,但目标是把一堆圆盘移动到目标柱子上,如果把上面的9个圆盘看成一套,第10个圆盘看成另一套,先移动9个圆盘到另一根柱子上,再把上面8个圆盘看成一套,第9个圆盘看成另一套--依次类
-
C语言递归之汉诺塔和青蛙跳台阶问题
递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题.汉诺塔问题等,在研究递归问题时我们要注意三点: 1.递归的结束条件 2.递归在每次进行过程中,都得离条件越来越近 3.相邻两次递归调用之间的关联关系 汉诺塔问题: 有三根杆子A, B, C.A杆上有N个(N > 1)穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 1.每次只能移动一个圆盘: 2.大盘不能叠在小盘上面,可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆,
-
带你理解C语言中的汉诺塔公式
目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 总结 汉诺塔公式 汉诺塔问题在数学层面的公式: 不用说,你看到这个公式一定一脸懵逼,我现在来讲解这个公式的作用. 先来回想一下大象放冰箱要几步,三步吧,打开冰箱,放进去,关上门就行了,我们先不要去思考一些细碎的步骤,将一个复杂的问题先简单化,再慢慢去分析. 那汉诺塔问题也是同样的简单三步:(假设有n个盘子) 一.把最大的盘子留在A柱,然后将其他的盘子全放在B柱. 二.把最大的盘子放到C柱. 三.然后将B柱上的
-
C语言递归:汉诺塔问题分析
目录 问题背景 游戏体验 汉诺塔移动次数规律 移动过程的深层解读 汉诺塔问题的三步过程归纳 图解: 发现: 代码实现1 仅打印移动次数 代码实现2 打印移动的具体过程 补充 问题背景 汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘.梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则: 每次只能移动柱子最顶端的一个圆盘:每个柱子上,小圆盘永远要位于大圆盘之上: 游戏
-
c语言循环加数组实现汉诺塔问题
目录 简介 递归的汉诺塔解法(c语言) 循环实现汉诺塔问题(c语言) 简介 汉诺塔问题是学数据结构与算法的时候会遇到的问题,相信来看本文的读者应该都对汉诺塔问题有基本的了解,理论上所有的递归都可以改成循环,常规的做法是借助堆栈,但是我一想好像用循环加数组也可以实现,于是就有了本文,实现声明,本文最后出来的算法效率不高的,比直接用递归实现还要差很多,追求算法效率的同学就不用看这个了.题目:假设有3个柱子,分别为A.B.C,A柱子上有数量为n个的空心圆盘,从上到下序号分别为1...n,要求把A柱子中
-
python实现汉诺塔递归算法经典案例
学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解.这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅. 网上找了一张汉诺塔的图片,汉诺塔就是利用用中间的柱子把最左边的柱子上的圆盘依次从大到小叠上去,说白了就是c要跟原来的a一样 废话少说,先亮代码 def move(n, a, buffer, c): if(n == 1): print(a,"->",c) return mov
-
C语言实现汉诺塔游戏
操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么? 代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了. stackfunc.c #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void pus
-
C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那就需要把1 2移动到c 由此我们可以推出要把1,2移动到c,只需要把1移动到b 这里我们发现有很多重复的自相似动作 我们就可以设计递归 递归需要1,递归体 2 出口. 递归体 移动n-1个盘子和1个盘子和n个盘子过程都是相似的 但是每次放入的杆子不一样. 出口 n=1时只剩一个盘子,直接移动到c即可
随机推荐
- AngularJS通过ng-route实现基本的路由功能实例详解
- 硬盘启动提示verifying DMI Pool Data错误的解决方法
- 通过批处理修改DNS的代码(推荐)
- Java中常用修饰符的使用方法汇总
- Windows Oracle常见服务介绍
- 关于json字符串与实体之间的严格验证代码
- Ajax解决缓存的5种方法总结(推荐)
- js与jquery回车提交的方法
- python错误处理详解
- C语言使用普通循环方法和递归求斐波那契序列示例代码
- Android编程实现两点触控功能示例
- 浏览器关闭后,能继续执行的php函数(ignore_user_abort)
- JQuery实现Ajax加载图片的方法
- P3P Header解决Cookie跨域的问题
- php截取utf-8中文字符串乱码的解决方法
- Python的Flask框架使用Redis做数据缓存的配置方法
- Jquery Ajax xmlhttp请求成功问题
- Android树形控件的实现方法
- CSS样式表的背景渲染效率
- matplotlib中legend位置调整解析