如何掌握二进制搜索递归的概念,用Java中给出的例子?

时间:2016-11-06 18:19:05

标签: java recursion

最近,我意识到我没有像我想象的那样得到递归。这就是为什么我试图找到尽可能多的例子来解决这个问题的原因,但我抓得非常快。

它是简单的二进制搜索代码,但我很难理解递归部分。特别是因为我不知道每一步都会有什么变化。如果在任何时候给出任何变量都有+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));
    }
}

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)的值为startmidPoint的值将与这个电话。

(这适用于所有方法,而不仅仅是递归方法。此外,请注意endarray 执行在整个递归调用中保留其值,但这是因为您在第一个和第二个参数位置“将它们传递给自己”。)