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]?
答案 0 :(得分:1)
这是代码正在实现的一般想法:
要找到数组的最小元素,我们可以找到数组中每一半的最小值,然后取这两个数中的最小值。
我们如何找到每一半的最小值?我们只是使用相同的技术将其分解为四分之一。
最终我们会问自己单个元素的min元素是什么,当然这是元素。
图像中显示的算法实现了此配方。
答案 1 :(得分:0)
您的功能基本上是将数组分成两半以进行每次搜索。
让我们一步一步地进入一个非常简单的输入:
第一个电话将是
- findMin([5,3],0,1) - &gt; (我们在这里)
由于startIndex
和endIndex
不相同,因此数组将分为两部分:[5]
和[3]
。虽然每个数组中只有一个值仍然是数组,但请记住。首先,解析leftMin
变量,因此堆栈将如下所示:
- findMin([5,3],0,1) - &gt; (待定结果)
- leftMin = findMin([5],0,0) - &gt; (我们在这里)
我们可以看到startIndex
和endIndex
都相同,所以返回我们的号码。下一步是验证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的leftMin
和rightMin
的值。将返回rightMin
,因为它保持它们之间的最小值。
事件虽然我们刚到第二级递归时,同样的逻辑适用于每个新级别:该方法将数组分成两半,直到它只有一个值,并且它们将返回该值。之后,将比较左侧和右侧的值,每个级别将返回最小值,直到第一个值,这将定义整个数组的最小值。