
本文讲解如何优化 java 程序,避免重复输入,将用户仅需输入一次的数值(如 40)在后续 6 次计算中重复使用,提升交互效率与代码合理性。
本文讲解如何优化 java 程序,避免重复输入,将用户仅需输入一次的数值(如 40)在后续 6 次计算中重复使用,提升交互效率与代码合理性。
在您当前的代码中,Scanner 实例和 int a = s.nextInt() 被置于 for 循环内部,导致程序每次迭代都暂停等待用户输入——这违背了“只输入一次、调用六次”的设计目标。正确做法是将输入逻辑移至循环外部,确保用户仅输入一次,而该值被后续所有迭代复用。
以下是重构后的专业级实现(含性能优化与健壮性增强):
import java.util.Scanner;
public class FibonacciRunner {
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 input = scanner.nextInt(); // ✅ 单次读取,全局有效
final int NUM_CALLS = 6;
for (int i = 1; i <= NUM_CALLS; i++) {
long start = System.currentTimeMillis(); // ✅ 推荐使用 System.currentTimeMillis() 替代 Date().getTime()
count = 0; // 重置计数器,便于每次独立统计递归调用次数
int result = fibonacci(input);
long end = System.currentTimeMillis();
System.out.printf("Call %d: F(%d) = %d | Recursive calls: %d | Time: %d ms%n",
i, input, result, count, end - start);
}
scanner.close(); // ✅ 善后:关闭资源
}
}? 关键改进说明:
- 输入解耦:Scanner 和 input 定义在 for 循环外,实现“一次输入,多次使用”;
- 性能提示:原 new Date().getTime() 已替换为更轻量、更精确的 System.currentTimeMillis();
- 可维护性增强:使用 final int NUM_CALLS = 6 替代魔法数字,提升可读性与可配置性;
- 资源安全:显式调用 scanner.close() 防止资源泄漏;
- 调试友好:每次调用前重置 count,确保各次递归深度统计独立准确。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 当前 fibonacci() 是朴素递归实现,时间复杂度为 O(2ⁿ)。若输入值较大(如 > 40),会导致显著延迟甚至栈溢出。生产环境建议改用迭代法或记忆化递归;
- Scanner 在读取整数后若后续需读取字符串(如 nextLine()),需注意缓冲区残留换行符问题——本例无此需求,故未处理;
- 多次调用同一输入时,若业务逻辑依赖状态变化(如修改 input),需额外考虑变量作用域与不可变性设计。
通过本次重构,您不仅解决了连续输入冗余问题,更践行了“单一职责”与“资源最小化”等核心编程原则——这是构建高可用 Java 应用的重要基础。










