1、题目描述
写一个函数,输入 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
2、VS2019上运行
代码随想录的五步曲
#include <iostream>
#include <vector>class Solution {
public:int fib(int N) {if (N <= 1) return N;std::vector<int> dp(N + 1); // 创建一个长度为 N+1 的动态数组 dpdp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {dp[i] = dp[i - 1] + dp[i - 2]; // 计算斐波那契数列第 i 项的值}return dp[N]; // 返回斐波那契数列第 N 项的值}
};int main() {int N = 5;Solution s;int result = s.fib(N); // 调用 fib 方法计算斐波那契数列第 N 项的值std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;return 0;
}
运行结果:
Fibonacci number at position 5 is: 5
(这里出问题了,N=45时就出现错误,这是因为对于斐波那契数列,随着 n 的增加,数列的值增长非常迅速。当使用普通的整数类型(如 int 或 long long)进行计算时,这些类型的取值范围是有限的,无法容纳较大的斐波那契数列项。)
换官方题解
#include <iostream>class Solution {
public:int fib(int n) {int MOD = 1000000007; // 定义一个常量 MOD,用于取模运算if (n < 2) {return n; // 如果 n 小于 2,直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1}int p = 0, q = 0, r = 1; // 初始化前两项和当前项的值for (int i = 2; i <= n; ++i) {p = q; // 将 q 的值赋给 p,保留前一个项的值q = r; // 将 r 的值赋给 q,更新当前项的值r = (p + q) % MOD; // 计算下一项的值,并对 MOD 取模以避免溢出}return r; // 返回斐波那契数列第 n 项的值}
};int main() {int N = 10;Solution s; // 创建 Solution 类的对象int result = s.fib(N); // 调用 fib 方法计算斐波那契数列第 N 项的值std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;return 0;
}
运行结果:
Fibonacci number at position 10 is: 55
3、代码随想录解题思路
代码随想录的动态规划五步曲
- 1、确定dp数组(dp table)以及下标的含义
- 2、确定递推公式
- 3、dp数组如何初始化
- 4、确定遍历顺序
- 5、举例推导dp数组
4、官方题解解题思路
- 1.首先,我们定义了一个类 Solution,其中包含一个名为 fib 的方法,用于计算斐波那契数列的第 N 项的值。
- 2.在 fib 方法中,我们首先定义了一个常量 MOD,用于进行取模运算。这个常量的值是 1000000007,是为了在计算过程中避免溢出。
- 3.接下来,我们使用一个条件语句判断给定的 n 是否小于 2。如果是,则直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1,所以它们的值与 n 相等。
- 4.然后,我们初始化三个变量 p、q 和 r 分别为 0、0 和 1。这些变量分别表示当前项、前一项和下一项的值。
- 5.进入循环,从索引 2 开始,直到 n。在每次循环中,我们更新变量的值:将 q 的值赋给 p,r 的值赋给 q,并计算 (p + q) % MOD 的结果并赋给 r。这样就实现了逐步计算斐波那契数列的下一项的值。
- 6.循环结束后,我们返回变量 r 的值作为斐波那契数列的第 N 项的结果。