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

使用递归函数查找整数最长连续相同数字序列的问题排查

修复递归函数查找最长连续相同数字序列的bug

问题根源

  • 全局变量状态残留:原代码用全局变量存储currentLength、maxLength、currentDigit,每次调用函数后这些变量不会自动重置,后续调用会沿用之前的状态,导致结果混乱。
  • 递归逻辑错误:
    • 当当前数字与前一个数字相同时,错误地将maxLength赋值为1 + maxSequence(num/10),导致maxLength被错误累加,而非跟踪连续长度的最大值。
    • 切换数字时的分支逻辑混乱,错误重置maxLength,而非更新当前连续长度并对比最大值。

解决方案

由于不能修改函数参数,改用静态局部变量存储状态,并添加标志位确保每次调用时重置状态,同时修正递归逻辑:

int maxSequence(int num)
{
    static int currentLength = 0;
    static int maxLength = 0;
    static int currentDigit = -1;
    static bool isFirstCall = true;

    // 首次调用时重置所有状态变量
    if (isFirstCall) {
        currentLength = 0;
        maxLength = 0;
        currentDigit = -1;
        isFirstCall = false;
    }

    if (num <= 0) {
        // 恢复标志位,为下次调用做准备
        isFirstCall = true;
        return maxLength;
    }

    int digit = num % 10;
    if (digit == currentDigit) {
        currentLength++;
        // 更新最大长度
        if (currentLength > maxLength) {
            maxLength = currentLength;
        }
    } else {
        currentDigit = digit;
        currentLength = 1;
        // 首次出现的数字也要对比最大长度
        if (currentLength > maxLength) {
            maxLength = currentLength;
        }
    }

    return maxSequence(num / 10);
}

代码说明

  • 静态变量仅在第一次初始化,通过isFirstCall标志位确保每次调用函数时重置状态,避免全局变量的残留问题。
  • 递归时先处理当前个位数字,更新当前连续长度currentLength,并实时对比更新最大长度maxLength。
  • 递归终止时恢复isFirstCall标志位,保证下次调用函数时状态干净。

测试验证

  • 输入1111555:处理顺序为5→5→5→1→1→1→1,最终返回4,符合预期。
  • 输入2223333:处理顺序为3→3→3→3→2→2→2,最终返回4,符合预期。
  • 输入222333:处理顺序为3→3→3→2→2→2,最终返回3,符合预期。

内容的提问来源于stack exchange,提问作者Danielle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:40:22