1)题目
斐波那契数列求解
要求:
写一个函数,输入n,求解斐波那契数列的第n项,斐波那契数列的定义如下
2)思路
结合时间复杂度考虑,有以下几种解法
(1)可以使用递归来实现,但n过大的时候,存在调用栈溢出的问题(因为求解过程中存在很多重复求解的子问题),时间复杂度
O
(
2
n
)
O(2^n)
O(2n)。
(2)可以用自下而上的方法循环解决问题,时间复杂度为
O
(
n
)
O(n)
O(n)。
(3)基于矩阵求解,时间复杂度为
O
(
l
o
g
n
)
O(log n)
O(logn),暂不介绍。
3)代码
(1) 第一种递归解法
#include <iostream>
using namespace std;
long long fibo(int n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
return fibo(n - 1) + fibo(n - 2);
}
int main()
{
long long result = fibo(100);
return 0;
}
(2) 第二种自下而上的循环解法
#include <iostream>
using namespace std;
long long fibo_effective(int n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
long long fibo_b = 1;
long long fibo_a = 1;
long long fibo_i = 0;
for (int i = 2; i < n; i++)
{
fibo_i = fibo_a + fibo_b;
fibo_a = fibo_b;
fibo_b = fibo_i;
}
return fibo_i;
}
int main()
{
long long result = fibo_effective(100);
return 0;
}
4)相关应用
- 青蛙跳台阶问题/兔子繁殖问题
- 矩形填充问题