如何使用递归来获取数组的最小值

时间:2015-02-23 01:12:12

标签: java arrays recursion

所以我目前的任务是创建一个递归函数,迭代数组并返回它的最小值。

我已经查看了类似的问题,但它们与我的相匹配,因为我只能将数组和数组的大小作为参数。

这是我到目前为止的代码

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

4 个答案:

答案 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个元素的数组调用它,则会抛出异常,这是正常的,因为您无法从空集中确定最小元素。