#include <iostream>
using namespace std;
int Fibonacci(int n) {
/*斐波拉契数列问题-递归*/
//if(n==0)return 0;
//if(n==1)return 1;
//else return ( Fibonacci(n-1) + Fibonacci(n-2) );
/*斐波拉契数列问题-循坏*/
int result=1;
int pre_result=0;
if(n==0) {result=0;}
if(n==1) {result=1;}
while(n>1){
int temp=result;
result += pre_result;
pre_result = temp;
n--;
}
return result;
}
int jumpFloor(int number) {
/*跳台阶问题-递归*/
//if(number<0)return 0;
//if(number==0)return 1;
//if(number==1)return 1;
//else return (jumpFloor(number-1) + jumpFloor(number-2));
/*跳台阶问题-循坏*/
int way=1;
int pre_way=1;
if(number<0)way=0;
if(number==0)way=1;
if(number==1)way=1;
while(number>=2){
int temp=way;
way += pre_way;
pre_way = temp;
number--;
}
return way;
}
int jumpFloorII(int number) {
/*变态跳台阶问题-递归*/
//if(number<0)return 0;
//if(number==0 || number==1)return 1;
//int ways=0;
//while(number > 0){
//number--;
//ways += jumpFloorII(number);
//}
/*变态跳台阶问题-(数学分析)*/
if(number<0)return 0;
if(number==0 || number==1)return 1;
return 1<<(number-1);
}
int rectCover(int number) {
/*格子填充问题*/
if(number==0)return 0;
else if(number==1)return 1;
else if(number==2)return 2;
/*递归*/
// else return rectCover(number-1) + rectCover(number-2);
/*循环*/
else{
int ways = 2;
int pre_ways=1;
while(number-->2){
int temp=ways;
ways += pre_ways; // f(n)=f(n-1)+f(n-m), m is the rows
pre_ways = temp;
}
return ways;
}
}
int main()
{
cout << Fibonacci(5)<<endl;
cout << jumpFloor(3)<< endl;
cout << jumpFloorII(4)<<endl;
cout << rectCover(4)<<endl;
return 0;
}