
本文讲解如何优化 java 程序,使用户只需输入一次目标数值,程序便在其后连续六次调用斐波那契方法并记录每次耗时,避免重复输入和资源重复创建。
本文讲解如何优化 java 程序,使用户只需输入一次目标数值,程序便在其后连续六次调用斐波那契方法并记录每次耗时,避免重复输入和资源重复创建。
在您提供的代码中,Scanner 实例和用户输入语句被错误地置于 for 循环内部,导致程序每轮迭代都重新提示“Enter a number:”,违背了“仅输入一次”的需求。正确做法是将输入逻辑移至循环外部,确保 a 的值在六次调用中保持不变;同时,为提升健壮性与性能,还需优化时间测量方式(避免使用已弃用的 Date.getTime())并合理管理 Scanner 资源。
以下是重构后的专业级实现:
import java.time.Instant;
import java.util.Scanner;
class Main {
private static int count = 0;
public static int fibonacci(int n) {
count++;
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a number: ");
int a = scanner.nextInt();
scanner.close(); // 及时关闭,防止资源泄漏
int n = 6;
System.out.println("Performing " + n + " consecutive Fibonacci calculations for input: " + a);
System.out.println("-".repeat(50));
for (int i = 1; i <= n; i++) {
count = 0; // 每次调用前重置计数器(可选,用于统计单次递归深度)
long start = Instant.now().toEpochMilli();
int result = fibonacci(a);
long end = Instant.now().toEpochMilli();
long durationSec = (end - start) / 1000;
long durationMs = end - start;
System.out.printf("Call %d: F(%d) = %d | Recursive calls: %d | Time: %d ms (%d s)%n",
i, a, result, count, durationMs, durationSec);
}
}
}✅ 关键改进说明:
- 输入一次性完成:Scanner 创建与 nextInt() 均位于循环外,保证 a 值恒定;
- 时间测量更准确:使用 java.time.Instant 替代过时的 Date.getTime(),毫秒级精度且线程安全;
- 资源管理规范:显式调用 scanner.close(),避免潜在的资源泄露;
- 输出信息丰富:每轮显示调用序号、输入值、结果、递归调用次数及精确耗时(毫秒+秒),便于性能分析;
- 状态隔离:每次循环前重置 count,确保各次递归统计独立(如需累计则移除此行)。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 斐波那契递归实现(O(2^n) 时间复杂度)在 a > 40 时将显著变慢甚至超时。生产环境建议改用迭代法或记忆化递归;
- 若需支持多次运行或交互式重试,应将输入逻辑封装为独立方法,并加入异常处理(如 InputMismatchException);
- 多线程环境下 count 需加同步或改用 AtomicInteger,但本例为单线程,无需额外同步。
通过以上调整,程序既满足“一次输入、六次调用”的核心需求,又具备良好的可读性、健壮性与教学示范价值。










