題目描述: k一只青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上一個n級的台階總共有多少種跳法。


時間限制:1秒     空間限制:32768k

斐波那契數列指的是這樣一個數列: 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 int JumpFloor(int target){

  if(target<0)

    return 0;

  int[] fib={0,1,2}; 

  if(target<3)

    return fib[target];

  return JumpFloor(target-1)+JumpFloor(target-2);

}

備注:此方法不滿足空間要求(遞歸空間)。

非遞歸算法:

public int JumpFloor(int target){

  if(target<0)

    return 0;

  int[] fib={0,1,2}; 

  if(target<3)

    return fib[target];

  int total=0;

  int firstElem=1;

  int secondElem=2;

  for(int i=3;i<=target;i++){  

    total=firstElem+secondElem;

    firstElem=secondElem;

      secondElem=total;  //迭代

  }

  return total;

}

轉自:http://www.nowcoder.com/questionTerminal/f4d47027d49a48b28274f6d4e0b6ff79?pos=12&tagId=0&orderByHotValue=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM