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

斐波那契搜索算法实现抛出索引越界异常,求问题排查

斐波那契搜索索引越界问题修复

问题根源

当搜索的数值大于数组中所有元素时,循环结束后offSet会被设置为数组最后一个元素的索引(n-1),此时offSet + 1等于数组长度n,超出了数组的有效索引范围(数组索引最大为n-1),导致访问arr[offSet + 1]时抛出索引越界异常。

修复方案

在最后一行的判断逻辑中,先添加offSet + 1 < n的条件,确保索引合法后再进行元素比较。修改后的完整代码如下:

public class Search
{
    public int FibonacciSearch(int[] arr, int x)
    {
        int n = arr.Length;
        int FibM2 = 0;
        int FibM1 = 1;
        int FibM = FibM1 + FibM2;

        while(FibM <= n)
        {
            FibM2 = FibM1;
            FibM1 = FibM;
            FibM = FibM1 + FibM2;
        }

        int offSet = -1;

        while (FibM2 > 0)
        {
            int index = Math.Min(offSet + FibM2, n - 1);
            if (arr[index] < x)
            {
                FibM = FibM1;
                FibM1 = FibM2;
                FibM2 = FibM - FibM1;
                offSet = index;
            }
            else if (arr[index] > x)
            {
                FibM = FibM2;
                FibM1 = FibM1 - FibM2;
                FibM2 = FibM - FibM1;
            }
            else
            {
                return index;
            }
        }

        // 先判断索引合法性,再执行元素比较
        if (FibM1 == 1 && offSet + 1 < n && arr[offSet + 1] == x)
            return (offSet + 1);

        return -1;
    }
}

补充说明

实际上在循环过程中,数组的最后一个元素已经通过Math.Min(offSet + FibM2, n - 1)被遍历过。当搜索值大于所有元素时,offSet最终会停在n-1,此时offSet +1必然超出数组范围,直接跳过该判断返回-1即可,不会遗漏任何有效匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:18