1. 程式人生 > >一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

就是 回歸 數列求和 AR 得出 for post 可能性 ...

斐波那契數列指的是這樣一個數列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。

可以觀察到,從第3個數開始,每個數的值都等於前連個數之和。

同時,定義f(0)=0, f(1)=1.

則 f(2)=f(1)+f(0)=1;

  f(3)=f(2)+f(1)=2;

  ... 依次類推,

  f(n)=f(n-1)+f(n-2)

該問題實質是斐波那契數列求和,遞推公式為 f(n)=f(n-1)+f(n-2);

可以考慮,小青蛙每一步跳躍只有兩種選擇

:一是再跳一級階梯到達第 i 級階梯,此時小青蛙處於第 i-1 級階梯;或者再跳兩級階梯到達第 i 級階梯,此時小青蛙處於第 i-2 級階梯。

於是,i 級階梯的跳法總和依賴於前 i-1 級階梯的跳法總數f(i-1)和前 i-2 級階梯的跳法總數f(i-2)。因為只有兩種可能性,所以,f(i)=f(i-1)+f(i-2);

依次類推,可以遞歸求出n級階梯跳法之和。

public class Solution {
public int JumpFloor(int target) {
int a=1;
int b=2;
int c=0;
if(target<=0){
return 0;
}else{
if(target==1||target==2)
return target;
else{
for(int i=3;i<=target;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
}
}

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

假設f(n)是n個臺階跳的次數。

  1. f(1) = 1

  2. f(2) 會有兩個跳得方式,一次1階或者2階,這回歸到了問題f(1),f(2) = f(2-1) + f(2-2)

  3. f(3) 會有三種跳得方式,1階、2階、3階,那麽就是第一次跳出1階後面剩下:f(3-1);第一次跳出2階,剩下f(3-2);第一次3階,那麽剩下f(3-3).因此結論是
    f(3) = f(3-1)+f(3-2)+f(3-3)

  4. f(n)時,會有n中跳的方式,1階、2階...n階,得出結論:

f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1) == f(n) = 2*f(n-1)

所以,可以得出結論

public class Solution {
public int JumpFloorII(int target) {
int a=1;
int b=2;
if(target<=0){
return 0;
}else{
if(target==1)
return target;
else{
for(int i=2;i<=target;i++){
b=2*a;
a=b;
}
return b;
}
}
}
}

一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。