1. 程式人生 > >斐波那契數列的實現算法

斐波那契數列的實現算法

spa 存在 例子 .com 例如 ccid demo1 並不是 基礎

最近在看算法方面的書籍,看到了一個很古老的問題-斐波那契數列,這個題目在大學的時候肯定接觸過,我們還在考試中考過,但是只是局限於當時課本上的內容,並沒有仔細的考慮過這個題目的實現方法,今天就來小小的探究一下

最常見的實現算法就是遞歸,這個問題也是一個很基礎的遞歸算法實現的例子;

求斐波那契數列第n個元素java代碼來實現遞歸的方法如下:

public static long FibonacciDemo1(long n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;

        return FibonacciDemo1(n - 1) + FibonacciDemo1(n - 2);
}

遞歸方法實現是看起來最簡潔的,但是並不是最好的;因為要求第n個元素的數據,就要先求第n-1和第n-2,同理要分別求f(n-2)+f(n-3)和f(n-3)+f(n-4),會存在大量的冗余計算;
例如要求f(10)的值需要分別做的計算如下:
在n逐漸增大的同時,運算時間也在指數增加,時間復雜度為O(2^n)
技術分享圖片

為了解決這個問題,提高運算效率,可以修改為一下方法

public static long FibonacciDemo2(long n) {
        if (n <= 0) return 0;

        long element1 = 1;
        long element2 = 0;
        
long result = 0; for (int i = 0; i < n; i++) { result = element1 + element2; element1 = element2; element2 = result; } return result; }
雖然不再采用遞歸方法,並且代碼看起來也更加的臃腫,但是在n趨向於大時,運算效率要遠遠高於遞歸方法,時間復雜度為
O(n)


面試中,可能面試官並沒有要求使用遞歸來實現一些算法,而我們常用的方法可能會禁錮我們的思維,有時候往往越普通的方法,能起到不一樣的作用;但是這還不是最終的解答

我們來討論一個時間復雜度為O(logn)的算法解答方法

斐波那契數列的實現算法