好的,下面是对 Java 实现斐波那契数列计算的详细解释,包括每个步骤的具体说明。
斐波那契数列计算
问题描述
斐波那契数列的定义如下:
- ( F(0) = 0 )
- ( F(1) = 1 )
- 对于 ( n > 1 ), ( F(n) = F(n-1) + F(n-2) )
本题的目标是计算给定 ( n ) 的斐波那契数,并将结果对 ( 10^9 + 7 ) 取模。
示例
- 输入:n = 2
- 计算:F(2) = F(1) + F(0) = 1 + 0 = 1
- 输出:1
- 输入:n = 3
- 计算:F(3) = F(2) + F(1) = 1 + 1 = 2
- 输出:2
- 输入:n = 4
- 计算:F(4) = F(3) + F(2) = 2 + 1 = 3
- 输出:3
Java 实现
以下是详细的代码实现和解释:
public class Fibonacci {
// 方法用于计算斐波那契数
public static int fib(int n) {
// 定义常量 MOD 为 1000000007,用于取模运算
final int MOD = 1000000007;
// 基本情况:如果 n 是 0 或 1,直接返回 n
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
// 创建一个数组 dp 用于存储斐波那契数
int[] dp = new int[n + 1];
dp[0] = 0; // F(0) = 0
dp[1] = 1; // F(1) = 1
// 通过迭代计算斐波那契数,从 2 到 n
for (int i = 2; i <= n; i++) {
// F(i) = F(i-1) + F(i-2),并对结果取模 MOD
dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
}
// 返回计算得到的 F(n)
return dp[n];
}
public static void main(String[] args) {
// 示例测试
int n = 2;
System.out.println("F(" + n + ") = " + fib(n)); // 输出: 1
n = 3;
System.out.println("F(" + n + ") = " + fib(n)); // 输出: 2
n = 4;
System.out.println("F(" + n + ") = " + fib(n)); // 输出: 3
}
}
代码详细解释
- 常量定义:
final int MOD = 1000000007;
定义了一个常量
MOD
为 (10^9 + 7),用于取模运算以防止结果溢出。 - 基本情况处理:
if (n == 0) { return 0; } if (n == 1) { return 1; }
如果
n
为 0 或 1,直接返回相应的斐波那契数F(0) = 0
或F(1) = 1
。 - 数组初始化:
int[] dp = new int[n + 1]; dp[0] = 0; // F(0) = 0 dp[1] = 1; // F(1) = 1
创建一个长度为
n + 1
的数组dp
用于存储斐波那契数,初始化dp[0]
和dp[1]
为 0 和 1。 - 迭代计算:
for (int i = 2; i <= n; i++) { dp[i] = (dp[i - 1] + dp[i - 2]) % MOD; }
从
2
开始迭代到n
,通过状态转移方程F(i) = F(i-1) + F(i-2)
计算斐波那契数,并对每次结果取模MOD
。 - 返回结果:
return dp[n];
最后返回数组
dp
中的第n
个元素,即所求的斐波那契数F(n)
。 - 测试示例:
public static void main(String[] args) { int n = 2; System.out.println("F(" + n + ") = " + fib(n)); // 输出: 1 n = 3; System.out.println("F(" + n + ") = " + fib(n)); // 输出: 2 n = 4; System.out.println("F(" + n + ") = " + fib(n)); // 输出: 3 }