最近,我意识到我没有像我想象的那样得到递归。这就是为什么我试图找到尽可能多的例子来解决这个问题的原因,但我抓得非常快。
它是简单的二进制搜索代码,但我很难理解递归部分。特别是因为我不知道每一步都会有什么变化。如果在任何时候给出任何变量都有+1或-1,我可能会得到它,但这里的变量是自然传递的,没有任何变化。
public class BinarySearchRecursion {
public static int binarySearch(int[] array, int value, int start, int end) {
if ((end - start) <= 1) {
if (array[start] == value)
return start;
if (array[end] == value)
return end;
return -1;
}
int midPoint = (start + end) / 2;
if (array[midPoint] > value) {
return binarySearch(array, value, 0, midPoint);
} else {
return binarySearch(array, value, midPoint, end);
}
}
public static void main(String[] args) {
int[] a = { 4, 9, 10 };
System.out.println(binarySearch(a, 10, 0, a.length - 1));
}
}
答案 0 :(得分:1)
在整个不同的递归调用中,您认为名为start
的参数是相同的变量似乎被误导了 - 但这是不的情况(同样对于{{1} })。在不同的递归调用中,特定参数的值之间存在 no 直接连接,即使它具有相同的名称。相反,参数值按位置传递 :当您调用end
时,您在第三个参数位置写入的任何表达式将成为新调用中binarySearch
的值。
因此,如果start
为真,您将调用array[midPoint] > value
,这实际上是一个错误 - 它应该是binarySearch(array, value, 0, midPoint)
。这意味着在新调用中,binarySearch(array, value, start, midPoint)
的值将与此调用中的值相同,但start
的值将是此调用为end
计算的值。否则,您将致电midPoint
,以便在新通话中,binarySearch(array, value, midPoint, end)
的值为start
,midPoint
的值将与这个电话。
(这适用于所有方法,而不仅仅是递归方法。此外,请注意end
和array
执行在整个递归调用中保留其值,但这是因为您在第一个和第二个参数位置“将它们传递给自己”。)