劍指offer-面試題 9 斐波那契數列

面試題 9 斐波那契數列

  題目:寫一個函數,輸入 n,求斐波那契數列的第 n 項。

思路

  斐波那契數列是一個很出名的數列,它的特點是從第三項開始,每項都等於前兩項之和。對於它的實現有多重方法,有優有劣,直接看代碼吧:

代碼

package swordOffer;
/**
 * 面試題 9:斐波那契數列
 * 題目:寫一個函數,輸入 n,求斐波那契數列的第 n 項。
 * 
 * @author Stephen Huge
 *
 */
public class Ex09Fibonacci {
    public static void main(String[] args) {
        //long類型變量佔4個字節,的取值範圍-2,147,483,648到2,147,483,647,在此n最大能取到46,
        //也就是斐波那契數列的第46項:1,836,311,903,到第47項爲2,971,215,073,大於long最大取值
        long a = fibonacci(46);
        System.out.println(a);
    }
    public static long fibonacci(int n) {
        int a = 0;  
        int b = 1;
        int res = 1;
//      if(n == 1) {
//          System.out.print(res + "\t");
//      }
        for(int i = 1; i < n; i++) {
//          if(i == 1) {
//              System.out.print(res + "\t");
//          }
            res = b + a;
            a = b;
            b = res;            
//          System.out.print(res + "\t");
//          if((i + 1) % 10 == 0) {
//              System.out.println();
//          }
        }
        return res;
    }
    //  遞歸實現,效率十分低下
    public static long f(int n) {
        return n > 2 ? f(n - 1) + f(n - 2) : 1;
    }
}

輸出結果爲:

1836311903

  由代碼看,這兩個方法簡潔度上遞歸實現遠超循環實現,但是遞歸實現對於每項的前兩項都要從n==1開始計算,做了大量的無用功,導致效率十分低下,用循環實現是更好的選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章