斐波那契数列用纯递归写法计算数列的值,会大量计算重复的值,造成内存的大量消耗。
解决办法有两种,一是记忆性递归写法。将已经计算过的数存在数组里,下次需要该值时,先判断其是否被计算过,如果计算过就直接调用数组里的值,每计算过就先计算再把结果存在数组⾥
代码如下:
#include <stdio.h>
long long a[1000]={0,1,1};//数组a[n]的值就等于斐波那契数列f(n)的值
long long n;
long long fibo(long long num) {
if(num==1 || num==2)return a[num];//basic base
if(a[num])return a[num];//如果当前的值计算过了,直接返回函数值
a[num]=fibo(num-1)+fibo(num-2);//否则先计算存在数组⾥,再返回
return a[num];
}
int main(void) {
scanf("%lld",&n);
printf("%lld %lld\n",fibo(n+1),fibo(n));
return 0; }
二是直接递推,我们已经知道斐波那契数列的递推公式是 我们可以直接对数组进⾏⼀次循环,从前往后进⾏递推,将需要的斐波那契数列先算出来,然后主函数⾥⾯直接调⽤函数值。
代码如下
#include <stdio.h>
long long a[1000]={0,1,1};//数组a[n]的值就等于斐波那契数列f(n)的值
long long n;
void init(void)//递推
{
for(int i=3;i<=51;i++)
a[i]=a[i-1]+a[i-2];
}
int main(void) {
scanf("%lld",&n);
init();//先调⽤函数,实现斐波那契数列的计算
printf("%lld %lld\n",a[n+1],a[n]);
return 0; }