何为斐波那契数列
斐波那契数列(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++;}