10-I-斐波那契数列
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(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
解法
- 递归:由于给出了计算公式 F ( N ) = F ( N − 1 ) + F ( N − 2 ) F(N) = F(N - 1) + F(N - 2) F(N)=F(N−1)+F(N−2),可以使用递归的方式获得最终的结果
- 迭代:由于每个元素的计算结果只与最近的两个元素的结果相关,可以使用两个变量保存这两个相关的结果,并迭代进行更新,这样就避免了类似于递归方式很多重复的中间计算
代码实现
递归方法:
- python实现
class Solution:
def fib(self, n: int) -> int:
if n < 2:
return n
ans = self.fib(n-1) + self.fib(n-2)
return ans % 1000000007
- c++实现
class Solution {
public:
int fib(int n) {
if(n<2)
{
return n;
}
else
{
return (fib(n-1) + fib(n-2)) % 1000000007;
}
}
};
**迭代方法:**要注意迭代的终止,n要遍历到
- python实现
class Solution:
def fib(self, n: int) -> int:
if n < 0:
return 0
f0 = 0
f1 = 1
for i in range(2, n+1):
f = f0 + f1
f0 = f1
f1 = f
return f % 1000000007
- c++实现
class Solution {
public:
int fib(int n) {
if(n < 2)
{
return n;
}
else{
int MOD = 1000000007;
int f_0 = 0, f_1 = 1;
int ans = 0;
for(int i=2; i<=n; i++)
{
ans = f_0 + f_1;
f_0 = f_1;
f_1 = ans % MOD;
}
return ans % MOD;
}
}
};
复杂度分析
- 时间复杂度: 递归超时,迭代 O ( n ) O(n) O(n)
- 空间复杂度:迭代 O ( 1 ) O(1) O(1)