
本文讲解如何优化 java 程序结构,避免重复输入,将 scanner 和用户输入值提取到循环外部,从而实现“一次输入、六次调用”的高效逻辑。
本文讲解如何优化 java 程序结构,避免重复输入,将 scanner 和用户输入值提取到循环外部,从而实现“一次输入、六次调用”的高效逻辑。
在您提供的代码中,Scanner 实例和 System.out.println("Enter a number: ") 被错误地置于 for 循环内部,导致程序每次迭代都提示用户重新输入——这与“仅输入一次、执行六次计算”的需求完全相悖。正确做法是:将输入操作移至循环之前,确保 a 的值在六次调用中保持不变。
以下是重构后的专业写法(同时修复了其他潜在问题):
import java.util.Scanner;
class Main {
public static int count = 0;
public static int fibonacci(int a) {
count++;
if (a <= 1) {
return a;
}
return fibonacci(a - 1) + fibonacci(a - 2);
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in); // ✅ 移至循环外,复用同一实例
System.out.print("Enter a number: ");
int a = s.nextInt(); // ✅ 仅执行一次输入
int n = 6;
for (int i = 1; i <= n; i++) {
long start = System.currentTimeMillis(); // ✅ 推荐使用 currentTimeMillis() 替代 Date().getTime()
// 重置计数器(可选,便于每次独立统计递归调用次数)
count = 0;
int result = fibonacci(a);
long end = System.currentTimeMillis();
System.out.printf("Call %d: Fibonacci(%d) = %d | Recursive calls: %d | Time: %d ms%n",
i, a, result, count, end - start);
}
s.close(); // ✅ 始终关闭 Scanner 防止资源泄漏
}
}? 关键改进说明:
- 输入解耦:Scanner 和 nextInt() 移出循环,保证用户只输入一次;
- 性能优化:使用 System.currentTimeMillis() 替代 new Date().getTime(),更轻量且线程安全;
- 可观测性增强:添加调用编号、递归深度统计(count)、毫秒级耗时输出,便于调试;
- 资源安全:显式调用 s.close(),符合 Java 资源管理最佳实践。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 当前 fibonacci() 是朴素递归实现,时间复杂度为 O(2ⁿ)。若输入 a ≥ 45,单次计算可能显著延迟(甚至超时)。生产环境建议改用迭代法或记忆化递归;
- 若需支持多次不同输入的批量测试,应封装为方法(如 runBenchmark(int input, int repeats)),而非硬编码循环;
- count 是静态变量,跨调用共享——因此每次循环内需手动重置(如示例中 count = 0),否则累计值会失真。
通过这一结构调整,您不仅达成了“一次输入、六次调用”的核心目标,还提升了代码的健壮性、可维护性与专业度。










