美文网首页Java基础
算法:斐波那契数列(java实现)

算法:斐波那契数列(java实现)

作者: Merbng | 来源:发表于2020-03-13 16:01 被阅读0次

斐波那契数列

由于斐波那契数列是以兔子的繁殖引入的,因此也叫“兔子数列”,它指的是这样一个数列:0,1,1,2,3,5,8,13...从这组数列可以明显看出这样一个规律:从第三个数开始,后边一个数一定是在其之前两个数的和,在数学上,斐波那契数列可以以这样的公式表示:
F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2),(n>=2)

实现方式1:递归

既然该数列已经有这样一个规律:F(n)=F(n-1)+F(n-2);那么我们可以用递归的方法,这样的代码比较简洁

 long fbnq1(long num) {
        if (num == 1 || num == 0) {
            return num;
        }
        return fbnq1(num - 1) + fbnq1(num - 2);
    }

    //也可以这样写
    long fbnq(long n) {
        return n < 2 ? n : fbnq(n - 1) + fbnq(n - 2);
    }

这样的递归算法虽然只有简单的几行,但是效率却很低,其时间复杂度为 O(n^2)

实现方式2:非递归

如果在时间复杂度和空间复杂度都有要求的话,我们可以使用非递归的算法来实现

  • 1.时间复杂度为O(N),空间复杂度为O(N)
    创建一个数组,每次将前两个数相加后直接赋值给后一个数,这样的话,有N个数就创建包含N个数的一维数组,所以空间复杂度为O(N),由于只需从头到尾遍历一遍,时间复杂度为O(N)
    long[] fbnq4Array(long n) {
        long[] array = new long[(int) (n + 1)];
        array[0] = 0;
        array[1] = 1;
        for (int i = 2; i <= n; i++) {
            array[i] = array[i - 1] + array[i - 2];
        }
        return array;
    }
  • 2,时间复杂度为O(N),空间复杂度为O(1)
    借助两个遍历first和second,每次将first和second相加后赋值给third,再将second赋值给first,third赋给second,如此循环
    long fbnq3(long n) {
        long first = 1;
        long second = 1;
        long third = 0;
        for (int i = 3; i <= n; i++) {
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }

参考链接:

相关文章

网友评论

    本文标题:算法:斐波那契数列(java实现)

    本文链接:https://www.haomeiwen.com/subject/tqulshtx.html