You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

锁按钮按压次数计算方法多次调用异常 静态变量问题修复求助

问题根源

你的代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:38:12