劍指Offer-->斐波那契數列(三種實現方法)

    最近看起了劍指Offer,有很多非常不錯的題目值得思考,應該去做一下,感受編程的魅力~~(當然還是要承認自己有不足的地方,但儘量去完善每一行代碼~)  廢話少說,代碼搞起~

import java.util.Scanner;

/**
 * 現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。
 * 斐波那契數列,又稱黃金分割數列,指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,
 * 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
 */
public class Fibonacci {
    /*
        遞歸實現斐波那契數列有很大的弊端,在於當用樹形結構來表示依賴關係時,
        不難發現很多結點都是重合的,而且重複的結點會隨着n的增大而急劇增加。
     */
    //遞歸實現斐波那契數列(最簡單但最浪費時間的方法)
    public int Fibonacci1(int n){
        if(n <= 0)
            return 0;
        if(n == 1)
            return 1;
        return Fibonacci1(n -2) + Fibonacci1(n - 1);
    }
    //非遞歸實現斐波那契數列
    public int Fibonacci2(int n){
        if(n == 0)
            return 0;
        int[] index = new int[n + 1];
        index[0] = 0;  
        index[1] = 1;
        for(int i = 2;i <= n;i++)
            index[i] = index[i - 2] + index[i - 1];
        return index[n];
    }
    //非遞歸實現斐波那契數列2  這是看到了大神的解法,反正我覺得是屌的不行不行的  =。=
    public int Fibonacci3(int n) {
        if(n == 0)
            return 0;
        int[] index = new int[2];

        index[0] = index[1] = 1;

        for (int i = 3; i <= n; ++i)
            index[i % 2] += index[1 - i % 2];

        return index[n % 2];
    }
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        System.out.println("輸入一個整數:");
        int a = scanner.nextInt();
        System.out.println("Method1斐波那契數列的第" + a + "項爲:" + new Fibonacci().Fibonacci1(a));
        System.out.println("Method2斐波那契數列的第" + a + "項爲:" + new Fibonacci().Fibonacci2(a));
        System.out.println("Method3斐波那契數列的第" + a + "項爲:" + new Fibonacci().Fibonacci3(a));
    }

}
  做的時候感覺不太好實現,總有些地方覺得不對,其實只要對數組下標的尋找十分準確,這都不叫事~~而我經常就下標越界或者是指針對不上要輸出的值。。。哎。。。還要多加練習~

發佈了51 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章