Java中的递归二进制搜索
我不明白为什么下面的代码返回0 首先,这是我的测试: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) {
@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(注意:请不要在评论中发布答案。)