【发布时间】:2014-08-31 15:14:16
【问题描述】:
我正在编写一个递归方法,它不是执行二分搜索算法,而是将一个数组分成三个并使用三元搜索算法。我相当肯定我的递归案例是正确的,但我的基本案例似乎有问题。基本情况,如果数组包含两个或更少的值,应该以非递归方式检查值是否在数组中并返回索引。如果未找到该值,则返回 -1。
由于我无法弄清楚的原因,这个方法无论如何都会返回 -1。不管数组的大小,或者数组是否包含值。方法如下。
public static int trinarySearch(int[] array, int x, int low, int high) {
if (high - low < 3) { //BASE CASE.
for (int i = low; i < high; i++) {
if (array[i] == x) {
return i;
}
}
return -1;
} else { //RECURSIVE CASE.
int firstThird = low + (high - low) / 3;
int secondThird = low + 2 * (high - low) / 3;
if (x <= array[firstThird]) {
return trinarySearch(array, x, low, firstThird - 1);
} else if (x <= array[secondThird]) {
return trinarySearch(array, x, firstThird + 1, secondThird - 1);
} else { // must be (x > array[secondThird])
return trinarySearch(array, x, secondThird + 1, high);
}
}
}
在我的测试代码中,我只是将数组设置为 int[] array = {1, 2, .....}
假设我搜索 int 2,它在数组中。我在测试代码中设置了一个数组,并将方法调用为 trinarySearch(array, 2, 0, array.length-1)。它每次都打印-1。方法有问题,还是我只是设置了测试代码错误?
【问题讨论】:
-
x
-
正如@MitchWheat 所说,递归情况下的测试与递归调用的限制不一致,并且基本情况在之前
high停止。重新思考。插入一些打印语句或使用调试器来查看您的心智模型中的错误所在。
标签: java arrays algorithm recursion