您的位置:首页 > Web前端

剑指offer编程题——09 斐波那契数列以及相关问题

2018-03-16 14:46 323 查看
#include <iostream>
using namespace std;
/*
高效的斐波那契的循环式解法
递归式缺点:层数太多会溢出,计算重复,效率低
*/
long long FibonacciInCycle(unsigned n){
int result[2] = { 0, 1 };
if (n < 2)
return result
;

long long sum = 0;
long long a = 0;
long long b = 1;
for (unsigned i = 2; i <= n; ++i){
sum = a + b;
a = b;
b = sum;
}
return sum;
}

int FiboInRecusively(int n){
if (n <= 0) return 0;
if (n == 1) return 1;
return FiboInRecusively(n - 1) + FiboInRecusively(n - 2);
}

/*
一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法。(跟上面算法实质一模一样)
*/

int JumpFloor1(int n){
int res[2] = { 0, 1 };
if (n < 2)
return res
;
int sum = 0, a = 0, b = 1;
for (int i = 2; i < n; ++i){
sum = a + b;
a = b;
b = sum;
}
return sum;
}

/* *******  矩形覆盖问题  ***********
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
设总的方法f(n),有两种放法,则总的为①+②
1,竖着放,剩下n-1列,继续这样放,方法数f(n-1)
2,横着放,剩下n-2列,下面还得再放一个,方法数f(n-2)
即: f(n)=f(n-1)+f(n-2)  仍然是斐波那契数列
*/

int RectCover(int n){
int res[3] = { 0, 1, 2 };
if (n <= 2)
return res
;
int sum = 0, a = 1, b = 2;
for (int i = 3; i < n; ++i){ //从3开始
sum = a + b;
a = b;
b = sum;
}
return sum;
}

void main09(){
int N = 40;
int num1 = FibonacciInCycle(N);
cout << "循环:" << num1 << endl;

int num2 = FiboInRecusively(N);
cout << "递归:" << num2 << endl;

int num1 = RectCover(N);
cout << num1
4000
<< endl;

cout << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: