【问题标题】:How find minimum in a array recursive method works?如何在数组递归方法中找到最小值?
【发布时间】:2017-03-30 04:07:20
【问题描述】:
public static int findMin(int[] numbers, int startIndex, int endIndex) {
    if (startIndex == endIndex){
        return numbers[startIndex];
    }
    else {
        int midIndex = (startIndex + endIndex) / 2;
        int leftMin = findMin(numbers, startIndex, midIndex);
        int rightMin = findMin(numbers, midIndex + 1, endIndex);
        if (leftMin < rightMin)
            return leftMin;
        else
            return rightMin;
    }
}

我真的很难理解这个 find min 递归。这种递归方法找到数组中的最小数。

我是这么理解的。

假设我有一个数组 5, 3, -5, 8,startIndex 为 0,endIndex 为 3

第一次,midIndex = (0+3)/2 =1。所以它分为 3 和 -5。

然后它去findMin,所以它把Array, 0, 1传回给findMin。

然后,midIndex = (0+1)/2 = 0。然后将 Array, 0, 0 传回 findMin。

由于startIndex 0 = endIndex 0,返回numbers[startIndex](是5?​​)。

我真的不知道这个方法是如何找到最小数字的。既然startIndex总是为0,为什么还要返回numbers[startIndex]?

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    这是代码实现的总体思路:

    要找到数组的最小元素,我们可以找到数组每一半的最小值,然后取这两个数字中的最小值。

    我们如何找到每一半的最小值?我们只是使用相同的技术将其分成四等份。

    最终我们会问自己单个元素的最小元素是什么,当然就是那个元素。

    图片中显示的算法实现了这个配方。

    【讨论】:

      【解决方案2】:

      您的函数基本上是将您的数组分成两半以便每次进行搜索。

      让我们一步一步进入一个非常简单的输入:

      • 数组:[5, 3]
      • 开始索引:0
      • endIndex: 1

      第一个电话是

      • findMin([5,3], 0, 1) -> (我们在这里)

      由于startIndexendIndex 不相同,所以数组将被分成两部分:分别为[5][3]。尽管每个数组中只有一个值,但仍然是数组,请记住这一点。首先,leftMin 变量被解析,因此堆栈将如下所示:

      • findMin([5,3], 0, 1) ->(待定结果)
      • leftMin = findMin([5], 0, 0) -> (我们在这里)

      我们可以看到startIndexendIndex 是相同的,所以返回我们的号码。下一步是验证rightMin。让我们更新我们的堆栈:

      • findMin([5,3], 0, 1) -> (待定结果)
        • leftMin = 5
        • rightMin = findMin([3], 1, 1) -> (我们在这里)

      leftMin 也发生了同样的事情:我们有相同的索引值,所以在第一个 if 条件中返回数字。现在堆栈看起来像这样:

      • findMin([5,3], 0, 1) -> (我们在这里)
        • leftMin = 5
        • rightMin = 3

      现在我们回到栈顶,我们得到了 firstCall 的 leftMinrightMin 的值。 rightMin 将被返回,因为它拥有它们之间的最小值。

      事件虽然我们只是在递归的第二级时,但相同的逻辑适用于每个新级别:该方法将数组分成两半,直到它只有一个值,然后它们将返回这个值。之后,将比较左侧和右侧的值,每个级别都将返回最小值,直到第一个定义整个数组的最小值。

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2015-07-03
        • 1970-01-01
        相关资源
        最近更新 更多