C语言实现斐波那契数

斐波那契的前几项数值是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的函数内存;不会造成栈内存的过载。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值