锁按钮按压次数计算方法多次调用异常 静态变量问题修复求助
问题根源
你的代码中pressCounter和step是静态全局变量,第一次调用PressButton后它们的值不会自动重置,第二次调用时会直接使用上一次的残留状态,导致计算逻辑混乱,结果偏离预期。同时依赖静态变量的递归逻辑存在副作用,无法保证多次调用的独立性。
修复方案
去掉静态变量,改用局部变量或递归参数传递状态,确保每次调用的状态完全独立。以下提供两种修复实现:
方案1:递归参数传递状态
public class Main { public static long PressButton(long n) { if (n == 0) return 0; if (n == 1) return 1; if (n == 2) return 2; // 调用辅助函数,初始化状态参数 return n + calculatePresses(n, 2, 0); } private static long calculatePresses(long n, long step, long pressCounter) { long temp = (n - step) * step + 1; pressCounter += temp; if ((n - step) != 0) { return calculatePresses(n, step + 1, pressCounter); } return pressCounter; } public static void main(String[] args) { System.out.println(PressButton(3)); // 输出7 System.out.println(PressButton(4)); // 输出14 } }
方案2:迭代实现(更直观)
public class Main { public static long PressButton(long n) { if (n == 0) return 0; if (n == 1) return 1; if (n == 2) return 2; long pressCounter = 0; long step = 2; while (n - step != 0) { long temp = (n - step) * step + 1; pressCounter += temp; step++; } // 处理最后一步的按压计数 pressCounter += 1; return n + pressCounter; } public static void main(String[] args) { System.out.println(PressButton(3)); // 输出7 System.out.println(PressButton(4)); // 输出14 } }
修复说明
- 两种方案都移除了静态变量,每次调用
PressButton时都会重新初始化状态变量,彻底避免了跨调用的状态污染。 - 递归版本通过辅助函数传递当前的
step和累计按压数,保证递归过程的状态独立性;迭代版本用循环替代递归,逻辑更简洁易懂。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

