递归实现min_jumps函数输出-2147483642异常问题排查
递归实现最小跳跃数输出-2147483642的问题排查
问题根源
1. 终点参数错配
main里传递的end是数组长度(10),但数组的有效索引范围是0到9。这意味着只有当start等于10时才会触发终止条件返回0,但数组根本不存在索引10的元素,导致部分递归分支永远碰不到终止条件,最终返回初始的INT_MAX。
2. 整数溢出触发异常
当某个递归分支无法到达终点时,函数返回INT_MAX(2147483647)。上层调用会执行jumps = 递归结果 + 1,这时INT_MAX + 1会触发有符号整数溢出——按照补码规则,溢出后数值直接变为-2147483648,多次递归叠加后就会出现你看到的-2147483642这类异常值。
3. 循环边界未做可达性判断
原循环仅检查了跳跃的步数范围,没有考虑当前跳跃到的位置是否真的能继续走到终点。一旦某个分支陷入“跳了但到不了终点”的死胡同,就会返回INT_MAX引发溢出。
修复方案
1. 修正终点参数
把main里的end改成数组最后一个元素的索引(即lenOfArr - 1):
main() { int arr[] = {3, 2, 2, 1, 1, 1, 1, 2, 1, 1}; int lenOfArr = sizeof(arr)/sizeof(arr[0]); int ans = min_jumps(arr, 0, lenOfArr - 1); printf("%d", ans); }
2. 过滤不可达的递归分支
在递归函数里,先判断当前位置能否跳跃;如果子递归返回INT_MAX(说明子路径走不通),就跳过加1计算,避免溢出:
int min_jumps(int arr[], int start, int end) { if(start == end) return 0; // 当前位置无法跳跃,直接返回不可达标记 if(arr[start] == 0) return INT_MAX; int min = INT_MAX; for(int idx = 1; idx <= arr[start] && (start + idx) <= end; idx++) { int jumps = min_jumps(arr, start + idx, end); // 只有子路径可达时,才计算总跳跃数 if(jumps != INT_MAX) { jumps += 1; if(min > jumps) min = jumps; } } return min; }
3. 增加可达性判断
在main里判断返回值,如果是INT_MAX就输出“无法到达终点”,否则输出结果:
main() { int arr[] = {3, 2, 2, 1, 1, 1, 1, 2, 1, 1}; int lenOfArr = sizeof(arr)/sizeof(arr[0]); int ans = min_jumps(arr, 0, lenOfArr - 1); if(ans == INT_MAX) printf("无法到达终点"); else printf("%d", ans); }
修复后结果
给定数组的最小跳跃数是4,修复后的代码会正确输出这个值。
内容的提问来源于stack exchange,提问作者hadiya asif
相关产品推荐
相关产品推荐

