所以我目前的任务是创建一个递归函数,迭代数组并返回它的最小值。
我已经查看了类似的问题,但它们与我的相匹配,因为我只能将数组和数组的大小作为参数。
这是我到目前为止的代码
private static int findMin(int[] data, int size){
int i = 0;
if(size == 1){
return data[0];
}else if (data[0] < data[i++]){
return findMin(data, size-1);
}else{
return -1;
}
}
我的主要问题是我不确定如何比较数组的值以返回最小值。任何意见,将不胜感激。谢谢! 编辑:忘了提它是java
答案 0 :(得分:0)
更改
else if (data[0] < data[i++]){
return findMin(data, size-1);
类似
else if (data[size-1] < data[0])
data[0] = data[size-1];
return findMin(data, size-1);
这个想法是递归到一个仍然包含mininum元素候选者的较小数组。
答案 1 :(得分:0)
使用 数组详细信息(即,无法通过级别传递当前最小值 down ),以下伪代码(a)< / sup>可以做到:
def findMin (array, size):
//if size == 0:
//doSomethingIntelligent();
if size == 1:
return array[0]
minOfAllButLast = findMin (array, size - 1)
if array[size-1] < minOfAllButLast:
return array[size-1]
return minOfAllButLast
换句话说,列表的最小值是列表的最后一个元素和 rest 的最小值,其中终止条件是单个元素的大小为1的列表显然是最小的。
这显然不能处理零大小的列表,如何执行此操作取决于您是要返回指示符还是抛出异常或其他内容。注释代码是你可以处理它的一种方式,虽然它本身效率低下,因为它只需要检查一次:
def findMin (array, size):
if size == 0:
doSomethingIntelligent();
return findMinNonEmpty (array, size);
def findMinNonEmpty (array, size):
if size == 1:
return array[0]
minOfAllButLast = findMinNonEmpty (array, size - 1)
if array[size-1] < minOfAllButLast:
return array[size-1]
return minOfAllButLast
但是我必须告诉你,这是不是一个很好的递归用例。大多数缓慢减少解空间的算法(例如每个级别一个项目)很少。
最佳用例是那些能够快速减少解决方案空间的用例,就像每次一半解决方案空间的二进制搜索一样。
如果你将它用于教育,那很好,请记住,这不是你在现实世界中这样做的方式。为了找到最小值,迭代解决方案是最有效的方法:
def findMin (array, size):
if size == 0:
doSomethingIntelligent();
currMin = array[0]
for index in 1 thru size - 1 inclusive:
if currMin > array[index]:
currMin = array[index]
return currMin
(a)我通常只为作业提供伪代码,因为用你选择的语言实现它将使你成为一个更好的代码切割器: - )
答案 2 :(得分:0)
你几乎就在那里。您的第二种情况需要使用数组的 last 元素,而不是第一种,因为您只能减小大小。我假设我们被允许使用int.MaxValue
作为&#34; infinity&#34; (空列表的最小值)。
private static int findMin(int[] data, int size) {
if (size == 0) return int.MaxValue;
return Math.Min(data[size - 1], findMin(data, size - 1));
}
编辑:由于我们现在知道它的Java而上面是C#,因此需要进行一些非常的微小更改(算法仍然是同样,当然):
private static int findMin(int[] data, int size) {
if (size == 0) return Integer.MAX_VALUE;
return Math.min(data[size - 1], findMin(data, size - 1));
}
为了完整起见,如果我们不允许使用任何库帮助,我们可以明确地在两个值之间写出min
操作(即使min
没有为递归添加任何内容,不是&#34;作弊&#34;):
private static int findMin(int[] data, int size) {
if (size == 0) return Integer.MAX_VALUE;
int last = data[size - 1];
int minOfAllButLast = findMin(data, size - 1);
return last <= minOfAllButLast ? last : minOfAllButLast;
}
答案 3 :(得分:0)
此功能应该是您正在寻找的:
private static int findMin(int[] data, int size){
return ((size < data.length - 1) ? (Math.min(data[size], findMin(data, size + 1))) : (data[data.length - 1]));
}
使用findMin(data, 0)
它基本上从0开始。虽然data
的被访问子集的大小小于最后一个元素的索引,但该函数返回当前元素的最小值,并且元素的最小值更深在数组中,否则(结束符号)返回当前元素。如果通过传递1个元素的数组来调用方法,则会立即识别结束符号。如果使用包含0个元素的数组调用它,则会抛出异常,这是正常的,因为您无法从空集中确定最小元素。