1. 程式人生 > >【劍指offer】 斐波那契數列問題

【劍指offer】 斐波那契數列問題

1、斐波那契數列 (Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列: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*)

程式碼實現如下:

// 斐波那契數列的java實現 
public static int Fibonacci(int n) {
    int last=1,latter=1,result=0; //用於快取f(n-1) f(n-2)
    if (0==n)
        return 0;
    else if (1==n||2==n)
        return 1;
    else {
        for (int i=3;i<=n;i++){
            result=last+latter;  //計算f(n)
            last=latter;//更新f(n-2)
            latter=result;  //更新f(n-1)
        }
        return result;
    }
}

2、一隻青蛙一次可以跳上1級臺階,也可以跳上2級。 求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

用遞推可知其結果為斐波那契數列f(n)=f(n-1)+f(n-2)

public int JumpFloor(int n) {
int last=1,latter=2,result=0; //用於快取f(n-1) f(n-2)
    if (0==n)
        return 0;
    else if (1==n)
        return 1;  
    else if(2==n)
        return 2;
    else {
        for (int i=3;i<=n;i++){
            result=last+latter;  //計算f(n)
            last=latter;//更新f(n-2)
            latter=result;  //更新f(n-1)
        }
        return result;
    }
}

3、附加:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

   static int jumpFloorII(int number) {//羅列各項,尋找規律,可知f(n)=2的n-1次方
    int result=1;
    return result<<(number-1);//將乘法優化為位運算
}

4、我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?羅列各項,尋找規律,遞推可知其結果為斐波那契數列f(n)=f(n-1)+f(n-2)

 int rectCover(int target) {
    int last=1,latter=2,result=0; //用於快取f(n)=f(n-1)+f(n-2)
    if (1==target)
        return 1;
    else if (2==target)
        return 2;
    else {
        for (int i=3;i<=target;i++){
            result=last+latter; //計算f(n)
            last=latter; //更新f(n-2)
            latter=result; //更新f(n-1)
        }
        return result;
    }

}