- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语⾔:递归算法
⼀:递归的概念,什么是?
递归函数最通俗的讲法就是先传递,在⼀次⼀次的传递后再归来!
下⾯这个图能够很好的解释出递归函数的主要⼯作原理(红线先⾛绿线跟后)
1 void fun(int n)
2 {
3 if (n 9)
4 {
5 fun(n/10);
6 }
7 printf(%d , n % 10);
8 }
递归作为⼀种⾮常常⽤的算法,其本⾝定义为⼀个过程或函数在其定义或说明中有直接或间接
调⽤⾃⾝的 ⼀种⽅法, 简单点来说 就是 ⼀个函数段中套⽤了本函数,进⾏⼀定的重复循环,将⼀个⼤的问题层层转化为⼀个与原问题相似
的规模较⼩的问题来解决!
其最主要要求的是: 把⼤事化⼩。
递归算法有两个必要条件:
1.存在⼀个限制条件,使得满⾜这个条件时,递归能够主动不再继续进⾏。
2.在每次递归调⽤后,都必须更接近这个限制条件。
(在我个⼈看来,递归算法更像是⼀个循环,将该循环独⽴到⼀个函数中去,使后⾯使⽤时更⽅便!在我们写⼀个递归函数时,必须要明⽩
使⽤这个函数是为了求什么,这个函数的功能是什么!函数的功能应该更简谱,单⼀!不应掺杂进去别的与写该函数⽬的不相符的代码!
例如:
1 //递归⽅式求阶乘(不考虑溢出问题!)
2 int fac(int n)
3 {
4 if (n = 1)
5 {
6 return 1;
7 }
8 return n * fac(n-1);
9 }
上⾯是⼀个求阶乘的递归函数,其主要功能就是求⼀个数的阶乘,因此我们不应该在其中加⼊输⼊,输出等等功能!)
⼆:递归函数的运⽤。
(递归函数最主要,也是最难的⼀部就是寻找⼀个等价关系式,使得在⼀次⼀次的使⽤递归时能够更接近⾃⼰的⽬的!)
斐波那契数列
斐波那契数列的是这样⼀个数列:1、1、2、3、5、8、13、21、34…,即第⼀项 f(1) = 1,第⼆项 f(2) = 1…,第 n 项⽬为 f(n) = f(n-
1) + f(n-2)。求第 n 项的值是多少。
⾸先,我们要明⽩⽤递归写这个函数的主要功能是找到第n项的值是多少?
我们观察数列,前两项为1,第三项为前两项的和,第四项等于第⼆ 三项的和,因此我们可以得出⼀个结论,第n项等于第(n-1)与第
(n-2)项的和!
同时,我们应该注意到两个必要条件,存在⼀个限制条件,每次递归后更接近该递归函数!(每次运算都要在n的基础上-1,知道n=1或者
n=2时停⽌!
因此我们可以写出⼀下代码
1 int finbo(int n)
2 {
3 if (n == 1 || n == 2)
4 {
5 return 1;
6 }
7 els
8 {
9 return finbo(n - 1) + finbo(n - 2);
10 }
11 }
⼀个有明确,唯⼀功能的递归函数就写出来了
最终代码如下
1 #define _CRT_SECURE_NO_WARNINGS 1
2 #includestdio.h
3 #includemath.h
4 #includestdlib.h
5 #includestring.h
6 #includestdbool.h
7 int finbo(int n)
8 {
9 if (n == 1 || n == 2)
10 {
11 return 1;
12 }
13 else
14 {
15 return finbo(n - 1) + finbo(n - 2);
16 }
17 }
18 int main()
19 {
20 int n;
21 scanf(%d, n);
22 int m = finbo(n);
23 printf(%d, m);
24 return 0;
25 }
文档评论(0)