700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C 语言实现斐波那契数列 解决递归实现缺陷(算法)

C 语言实现斐波那契数列 解决递归实现缺陷(算法)

时间:2021-08-29 06:51:43

相关推荐

C 语言实现斐波那契数列 解决递归实现缺陷(算法)

何为斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,其斐波那契数列数列从第3项开始,每一项都等于前两项之和。


文章目录

何为斐波那契数列概况一、递归实现函数原理 : 二、交换位置方法原理: 当然你也可以这样写数列方式总结

概况

既然明确斐波那契数列确定基本算法 如果你要求第n个斐波那契数列**n=n-1+n-2**

提示:以下是本篇文章正文内容,下面案例可供参考

一、递归实现函数

int Fib(int n) {if (n>=2){return Fib(n - 1) + Fib(n - 2);}else{return 1;}}

原理 :

每次递归传入的值都是n-1和n+2的值,直到n>=2

为什么说n>=2要跳出循环,因为2的前面只有1,会最终导致程序少多加负数,所以要跳出来,2过了就是返回1即可


如果你觉得这样就行了得话,

你是没有见过如果使用这个递归算法

那将计算起来有多么的消耗计算速度 例如你要求第100斐波那契数 套入公式n=(n-1)+(n-2) 那你得先求出第99,和第98

而第99个又需要第98和第97个

而求第98个又需要第97和第96的

如果一直往下... ...

那么越是低位你数字你会发现计算重复次数越来越多 如图计算一个3的重复计算次数。。emmm计算100的时候我的电脑开飞机一般,所以不演示了我就计算第30个斐波那契数列里的3被重复计算的次数

if (n==3){count++;}if (n>=2){return Fib(n - 1) + Fib(n - 2);}else{return count;}

![在这里插入图片描述](https://img-/215921413.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FsaWNlc2E=,size_16,color_FFFFFF,t_70#pic_center)

所以这种方法不可取

二、交换位置方法

代码如下

int Fib(int n) {int a = 1;int b = 1;int c = 1;while (n>2){c = a + b;a = b;b = c;n--;printf("%d\n", c);}return c;}

原理:

在斐波那契实列里

1,1 ,2,3,5,8,13,21,。。。。。

先用a存1,b存1,a+b的结果2存给c

然后讲a的值给b,c(结果值)给b,

然后进入下一轮的时候

先用a存1,b存2,a+b的结果3存给c

然后再讲a的值给b,c(结果值)给b,

一步一步…

这的时候这个时候的数字被重复计算的次数就不存在了

当然你也可以这样写

return (x > 0 ? f(n - 1) + f(n - 2) : 1);

数列方式

int a = 0, b = 1, c = 0, n = 0, s = 50, arr[50];arr[0] = 1;while (s--){c = a + b;a = b;b = c;arr[n] = c;n++;}int i = 1, j = 4;int sz = sizeof(arr) / 4 - 1;while (sz--){j--;if (j == 0){j = 4;printf("\n");}printf("%d ", arr[i]);i++;}


总结

当然万变不离其宗,斐波那契数的算法依旧是 n=n-1+n-2

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。