斐波那契的前几项数值是1,1,2,3,5,8,13......,不难发现在斐波那契数列中,除了前两项是1外,后面的每一项都是前两项的和。发现了这一点之后,利用代码实现斐波那契数问题就变得容易很多了。只需要将函数进行递归就可以实现。那么就开始代码:
int fib(int n){
return n<=2?1:fib (n-1) + fib(n - 2);
// 判断n是否小于2 小于2返回1否者进行一次递归知道小于2为止
}
int main(){
printf("%d", fib(10));
return 0;
}
此时运行程序可以发现:
可以发现,和推算所处的数字一样。但是,新的问题又出现了。这样子的代码在要求大的时候,特别浪费内存空间,效率还特别低。是为什么呢?
我们需要想到,每一次在递归调用的时候都需要前面两项的数字,在求前面两项的时候,前面两项又需要再求前面两项。所以每一次运行程序的时候,都需要向栈内存申请2的n-2次方再乘以申请一次函数所需要的内存。n越大所需要的内存就更多,很容易造成栈内存的过载。这是内存方面。在递归前两项的时候,我们会发现,程序会多次求相同的一个数,造成了效率低的问题。
这是由于我们是由高到低递归所造成的,所以我思考了一下有没有从低到高的递归呢?
在后一项等于前两项和的思考下,我写出了下面的代码。
int fib(int s){
static int n=3;
static int a=1;
static int b=1;
int c=1;
if (s>0&&s<2)
{
return 1;
}else if(s<=0)
{
return -1;
}else
{
c = a + b;
a = b;
b = c;
return n<s?n++,fib(s):c;
}
}
int main(){
printf("%d",fib(30));
return 0;
}
这时候的代码在时间和空间上相较于一开始的代码都减少了很多,也只需要向栈申请n-3的函数内存;不会造成栈内存的过载。