1、斐波拉契数列
1.1题目描述
思路
:
斐波拉切的公式为:
F(0) = 0;
F(1) = 1;
F(n) = F(n-1)+F(n-2);(n>=2)
方法一:用递归解决。但是用递归的话系统会报错说调用的层次太多,因为递归的时间复杂度是O(2^n)是指数级别的,效率太低,一般不使用
int Fibonacci(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
方法二:采用迭代的方式实现:
int Fibonacci(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
{
int a = 0, b = 1;
int m = 0;
for (int j = 2; j <= n; j++)
{
m = a + b;
a = b;
b = m;
}
return m;
}
}
int main()
{
cout << Fibonacci(30) << endl;
}
1.2斐波拉契进阶版
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示列1:
输入:n=2
输出:1
示列2:
输入:n = 5
输出:5
提示:0<= n<= 100
方法一:使用数组循环来做
因为我们之前两种方法计算的斐波拉契数字都不能太大,会超过表示范围,所以这个问题和上面有所不同的是他对答案有所要求,需要进行取模运算。所以我们最后要对答案进行一个特殊的处理。
思路:
与上面不同的是,我们采用数组的方式来存储每一项的值,最后对结果值进行对1000000007的取模,最后得到的数就是一个不会超过取值范围的数。
代码实现:
int fid(int n)
{
int res[