手撕斐波那数列

162 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

斐波那数列

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 通过了!!!