Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的递归二进制搜索_Java_Recursion_Binary Search - Fatal编程技术网

Java中的递归二进制搜索

Java中的递归二进制搜索,java,recursion,binary-search,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) {

我不明白为什么下面的代码返回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

您的问题可能与以下呼叫有关:

Arrays.copyOfRange(arr, midpoint, (arr.length - 1))
根据文件:

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

如果我将呼叫更改为:

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

它返回2。

您是否尝试过使用调试器?这是错误的,因为您每次都在调整数组的大小。如果您在第一时间发现该事件,则将是正确的。但是之后,你得到的是相对于特定子数组的索引。您应该使用原始数组。虽然它不能解决问题,但请注意,如果需要
array.copyOf
(线性复杂度),您应该只使用线性搜索。只需将数组沿函数传递即可。您错过了数组的最后一个元素。copyOfRange是您独有的,您应该在最后一行传递arr.length,而不是array.length-1(注意:请不要在评论中发布答案。)