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

递归实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:30:32