Java中的递归二进制搜索

时间:2018-05-18 10:44:59

标签: java recursion binary-search

我不明白为什么以下代码返回 0

首先,这是我的测试:

 @Test
public void testOddEntriesMatchRecursive() {
    int[] arr = new int[]{1,3,5};
    ...
    Assert.assertEquals(2, Chopper.chopRecursive(5, arr));
}

接下来,以下是重要的实施部分:

static int chopRecursive(int toFind, int[] arr) {

    /* Empty array test */
    if (arr.length == 0) return -1;

    /* Calculate the midpoint */
    int midpoint = (arr.length) / 2;

    if (arr[midpoint] == toFind) {
        return midpoint;
    } else if (arr[midpoint] > toFind) {
        if (midpoint == 1) {
            if (arr[0] == toFind)
                return 0;
            else
                return -1;
        } else {
            return midpoint + chopRecursive(toFind, Arrays.copyOfRange(arr, 0, midpoint));
        }
    } else {
        return midpoint + chopRecursive(toFind, Arrays.copyOfRange(arr, midpoint, (arr.length - 1)));
    }
}

最后,这是我测试的结果:

java.lang.AssertionError: 
Expected :2
Actual   :0

1 个答案:

答案 0 :(得分:2)

您的问题可能出在以下调用中:

Arrays.copyOfRange(arr, midpoint, (arr.length - 1))

根据文件:

  

参数 to - 要复制的范围的最终索引,独占。 (该索引可能位于数组之外。)

如果我将通话更改为:

Arrays.copyOfRange(arr, midpoint, arr.length)

它返回2.