使用递归函数查找整数最长连续相同数字序列的问题排查
修复递归函数查找最长连续相同数字序列的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
相关产品推荐
相关产品推荐

