如何在数组递归方法中找到最小值?

时间:2017-03-30 04:07:20

标签: java recursion

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;
    }
}

我真的很难理解这个min 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,返回数字[startIndex](5?)。

我无法弄清楚这种方法如何找到最小数字。由于startIndex总是0,为什么需要返回数字[startIndex]?

2 个答案:

答案 0 :(得分:1)

这是代码正在实现的一般想法:

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

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

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

图像中显示的算法实现了此配方。

答案 1 :(得分:0)

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

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

  • 数组:[5,3]
  • startIndex:0
  • endIndex:1

第一个电话将是

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

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

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

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

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

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

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

现在我们回到了堆栈的顶部,我们得到了firstCall的leftMinrightMin的值。将返回rightMin,因为它保持它们之间的最小值。

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