【劍指offer】 斐波那契數列問題
阿新 • • 發佈:2019-01-26
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;
}
}