フィボナッチ数列の3つの実現方法

1.非常に非効率的なソリューション

public static long fibonacci1(int n) {
    
    
        if (n <= 0) return 0;
        if (n == 1) return 1;
        return fibonacci1(n-1) + fibonacci1(n-2);
    }

短所:再帰的解法のプロセスでは、多くのノードが繰り返され、nが増加すると反復ノードの数が急激に増加します。つまり、nが増加すると計算量が急激に増加します。

2.ノードの重複を回避する方法

下から上に計算し、最初にf(0)とf(1)に基づいてf(2)を計算し、f(1)とf(2)がf(3)を計算します...というように、n番目の項を計算できます、時間の複雑さはO(n)です。

public static long fibonacci2(int n) {
    
    
        if (n == 1 || n == 2) return  1;
        long fibNMinusOne = 1;  // 用来记录计算项的前面的前面的数
        long fibNMinusTwo = 1;  // 用来记录当前计算项的前一项
        long fibN = 0;          //用来记录结果
        for (int i = 2; i < n; i++) {
    
    
            fibN = fibNMinusOne + fibNMinusTwo;
            fibNMinusTwo = fibNMinusOne;
            fibNMinusOne = fibN;
        }
        return fibN;
    }

3.時間の複雑さはO(logn)ですが、実用的ではありません

    public static int fibonacci3(int n) {
    
    
        if (n == 0) return 1;
        if (n == 1) return 1;
        //n为偶数
        if (n % 2 == 0) return fibonacci3(n / 2) * fibonacci3(n / 2) + fibonacci3(n / 2 - 1) * fibonacci3(n / 2 - 1);
        //n为奇数
        else return fibonacci3(n / 2) * fibonacci3(n / 2 + 1) + fibonacci3(n / 2 - 1) * fibonacci3(n / 2);
    }

おすすめ

転載: blog.csdn.net/Zmd_23/article/details/108741759