劍指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;
}