1. 程式人生 > >斐波那契數列區間和

斐波那契數列區間和

     同事去某團面試,聊到演算法時問了“計算斐波那契數列下標從i到j的和”?

 斐波那契數列特點是當前值等於前2位的和, 例如0、1、1、2、3、5、8、13、21等等。

 構造斐波那契數列可以使用遞迴或者非遞迴的方法。 設想使用遞迴方式計算下標i、下標j的值, 假設下標i比較小, 那麼計算下標j的值時必然重複遞迴了i, 所以遞迴方法效能比較差。

     考慮使用非遞迴方式實現,儘量減少時間和空間複雜度。 

 思路: 使用for迴圈計算每個下標的值, 並在迴圈內計算和(省去再次for迴圈計算和的步驟)。 因為做了一個for迴圈,所以時間複雜度O(n); 因為new了陣列array,所以空間複雜度O(n)。 

    /**
     * 計算斐波那契數列第i位到第j位的和
     * @param i,低位下標
     * @param j,高位下標
     * @return 如果引數非法則返回-1, 如果引數合法則返回和
     */
    private static int fabonacciSum(int i, int j) {
        if (i > j || i < 0 || j < 0) {
            return -1;
        }

        if (j < 2) {
            return j;
        }

        int[] array = new int[j+1];
        int total;
        if (i < 2) {    //下面的for迴圈是從下標2開始的
            total = 1;
        } else {
            total = 0;
        }

        array[0] = 0;
        array[1] = 1;
        for (int k = 2; k <= j; k++) {
            array[k] = array[k-1] + array[k-2];

            if (k >= i) {
                total += array[k];
            }
        }

        return total;
    }


    public static void main(String[] args) throws Exception {

        int result = fabonacciSum(1, 2);
        int result1 = fabonacciSum(5, 8);

        System.out.println(result + ", " + result1);

    }

        感覺這是最優演算法, 歡迎討論~~~~