何为斐波那契数列
斐波那契数列(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-blog.csdnimg.cn/20200823215921413.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++;
}