描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1。
方法一、
为了避免考虑整数溢出问题,我们求 c%109+7的值,
递归:
时间复杂度是 O(2^n)
class Solution {
public:
int Fibonacci(int n) {
if(n <= 1){
return n;
}
return (Fibonacci(n - 1) + Fibonacci(n - 2)) % 1000000007;
}
};
方法二、
递归+滚动变量。
仔细观察我们会发现,递推时我们只需要记录前两项的值即可,没有必要记录所有值,所以我们可以用滚动变量递推。
时间复杂度还是 O(n),但空间复杂度变成了 O(1)。
class Solution {
public:
int Fibonacci(int n) {
int a = 0, b = 1, c = 0;
while(n--)
{
a = b, b = c;
c = (a + b) % 1000000007;
}
return c;
}
};
拓展:
以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。这个数列从第 3 项开始,每一项都等于前两项之和。输入一个整数 N,请你输出这个序列的前 N 项。
输入格式
一个整数 N。
输出格式
在一行中输出斐波那契数列的前 N 项,数字之间用空格隔开。
数据范围
0<N<46
输入样例:
5
输出样例:
0 1 1 2 3
方法:
多一行代码cout <<' '<<a;
class Solution {
public:
int Fibonacci(int n) {
int a = 0, b = 1, c = 0;
while(n--)
{
a = b, b = c;
c = (a + b) % 1000000007;
cout <<' '<<a;
}
return c;
}
};