1. 程式人生 > >斐波拉契數列 java實現

斐波拉契數列 java實現

指的是這樣一個數列:

1 1 2 3 5 8 13 21 34 ...

F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

也稱黃金分割數列,兔子數列

通項公式

(如上,又稱為“比內公式”,是用無理數表示有理數的一個範例。)

注:此時 

這樣一個完全是自然數的數列,通項公式卻是用無理數來表達的。而且當n趨向於無窮大時,前一項與後一項的比值越來越逼近黃金分割0.618。

1÷1=1,1÷2=0.5,2÷3=0.666...,3÷5=0.6,5÷8=0.625…………,55÷89=0.617977……………144÷233=0.618025…46368÷75025=0.6180339886…...

越到後面,這些比值越接近黃金比.

題目:寫一個函式,輸入n,求斐波那契數列的第n項為多少?


public class Test {

    public static void main(String[] args) {
        System.out.println("第4項斐波那契數列的值為:"+Fibonacci(4));
    }

    /*
     * 採用遞迴實現斐波那契數列生成函式,效率低
     */
    public static int generateFibonacci(int n){
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        return generateFibonacci(n-1)+generateFibonacci(n-2);
    }
    
    /*
     * 採用迴圈實現斐波那契數列
     * 儲存數列中間項,求得結果
     */
    public static int fibonacci(int n){
        int[] result={0,1};
        if(n<2)
            return result[n];
        int fibNMinusOne=1;
        int fibNMinusTwo=0;
        int fibN=0;
        for(int i=2;i<=n;i++){
            fibN=fibNMinusOne+fibNMinusTwo;
            fibNMinusTwo=fibNMinusOne;
            fibNMinusOne=fibN;
        }
        return fibN;
    }
}

Java實現

遞推方式

 public static void testFibonacci1(int n) {
        int a = 1, b=1, c = 0;
        for (int i = 1; i <= n; i++) {
            if (i == 1) {
                System.out.println("第" + i + "等於" + a);
            }else if (i == 2) {
                System.out.println("第" + i + "等於" + b);
            }else {
                c = a+b;
                a = b;
                b = c;
                System.out.println("第" + i + "等於" + c);
            }
        }
    }

遞推方式-陣列方式

 public static void testFibonacci2(int n) {
        int[] arrayList = new int[n];
        arrayList[0] = arrayList[1] =1;
        for (int i = 0; i < arrayList.length; i++) {
            if (i == 0) {
                System.out.println("第" + (i+1) + "等於" + arrayList[0]);
            }else if (i == 1) {
                System.out.println("第" + (i+1) + "等於" + arrayList[1]);
            }else {
                arrayList[i] = arrayList[i-1] +arrayList[i-2];
                System.out.println("第" + (i+1) + "等於" + arrayList[i]);
            }
        }
    }

遞迴方式

 public static int testFibonacci3(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }else {
            return test3(n-1) + test3(n-2);
        }
    }