写一个函数,输入 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
代码随想录的五步曲
#include
#include
class Solution {
public:
int fib(int N) {
if (N <= 1) return N;
std::vector<int> dp(N + 1); // 创建一个长度为 N+1 的动态数组 dp
dp[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
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
代码随想录的动态规划五步曲