劍指Offer-斐波那契數列以及跳臺階問題

劍指Offer-斐波那契數列以及跳臺階問題

斐波那契數列:

1,1,2,3,5……
規律:f(n) = f(n-1) + f(n-2)
題目描述:
輸入一個整數n,請你輸出斐波那契數列的第n項。
n<=39

分析:題目很簡答,遞歸也行非遞歸也行,代碼如下:

#include<iostream>
#include<algorithm>

using namespace std;

/*int Fibonacci(int n) {     //遞歸方法
  if(n==0) return 0;
  if(n==1 || n==2) return 1;
  return Fibonacci(n-1)+Fibonacci(n-2);
  }
*/

int Fibonacci(int n) {      //動規方法
  if(n==0) return 0;
  if(n==1 || n==2) return 1;
  int fn1 = 1;
  int fn2 = 1;
  while(n-- >2) {
    fn1 += fn2;
    fn2 = fn1-fn2;
  }
  return fn1;
}
int main()
{
  cout<<Fibonacci(6)<<endl;
  return 0;
}

跳臺階問題

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

分析:
類似斐波那契數列,青蛙最後一步跳到第n級,有兩種可能,一種是從n-2直接跳上來,一種是從n-1跳上來,因此同樣有規律f(n) = f(n-1) + f(n-2),其中f(1)=1,f(2)=2。代碼如下:

#include<iostream>
#include<algorithm>

using namespace std;

/*int jumpFloor(int number) {  //遞歸版本
  if(number==1) return 1;
  if(number==2) return 2;
  return jumpFloor(number-1)+jumpFloor(number-2);
  }
*/

int jumpFloor(int number) {    //非遞歸版本
  if(number==1) return 1;
  if(number==2) return 2;
  int fn1 = 2,fn2=1;
  while(number-- >2) {
    fn1 += fn2;
    fn2 = fn1-fn2;
  }
  return fn1;
}


int main() {
  cout<<jumpFloor(5)<<endl;
}

變態跳臺階

題目描述:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析:
根據跳臺階問題,分析得到:
f(n)=f(n-1)+f(n-2)+…+f(1)
而f(n-1)=f(n-2)+f(n-3)+…f(1)
故f(n)=2*f(n-1)
得到規律:f(n)=2^(n-1)
代碼如下:

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

int jumpFloorII(int number) {
  return pow(2,number-1);
}

int main() {
  cout<<jumpFloorII(4)<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章