手撕斐波那数列

斐波那数列

1、递归

做题的时候出现了超时的情况

class Solution {

public:

    int fib(int n) {
        int MOD=1000000007;
        int a;
        if(n==1 || n==2){
            return 1;

        }else if(n<0){
            return 0;
        } 
        else{

            return (fib(n-1)+fib(n-2))%int(1e9+7);
        }


    }
};

image-20211022223414983

这里就是通过不断递归,然后计算两项的值,但是由于会有很多重复的运算,会导致在运算基数比较大的情况下,会使花费的时间比较多,比如上面我就直接超时了。

2、迭代

由于我使用递归直接超时,所以我准备换一种办法,1前面的关于基本值当数字为0,1,2以下的时候判断是一样的,到后面我准备使用迭代。

主要就是不停的a1,a2,a3交换并且将值不停的叠加,达到计算出最后的和,也就是要的得到的斐波那数列的第N项的值。

class Solution {

public:

    int fib(int n) {
        int MOD=1000000007;
        int a;
        if(n==1 || n==2){
            return 1;

        }if(n<=0){
            return 0;
        } 
        else{
            int a1=0,a2=0,a3=1;
            for(int i=2;i<=n;i++){
                a1=a2;
                a2=a3;
                a3=(a1+a2)%MOD;

            }
            return a3;

        }


    }
};

服了我自己,哈哈哈哈没打括号,导致一直结果错误,C++也忘记的差不多了,

image-20211022231832134
通过了!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值