使用递归时最小数组值不正确

时间:2016-11-30 02:10:47

标签: java arrays recursion minimum

我正在尝试创建一种方法,使用递归搜索一维数组的最小值。它确实给了我一个输出,但它总是" 1"无论数组是否包含" 1"。我对编程非常陌生,感谢任何帮助。

public static int smallest(int[] array)
{
    return smallestFrom(array, 0);
}

static int min = 500; //large number

private static int smallestFrom(int[] array, int i)
{ 
    int x = array.length;
    if (i < x && array[i] < min)
    {
        min = array[i];
        i++;
        smallestFrom(array, i);
    }
    else if (i < x && array[i] >= min)
    {
        i++;
        smallestFrom(array, i);
    }
    return min;

}

输出:

2,4,6,1,6,3,8
Smallest: 1

43,76,3,23,95,23
Smallest: 1

1 个答案:

答案 0 :(得分:1)

您的实施对我来说很好。嗯,这有点太多了,但它确实有效。你可以改善这一点:

大整数

为什么要使用一些任意数字作为&#34;大数字&#34;?对于值大于500的输入,此代码将中断。您应该只使用常量Integer.MAX_VALUE。没有比这个值更大的值,它以明确的方式命名,并且由API定义。

全局变量

这是发生错误的地方。您的实现是专为单用途而设计的。用第一个数组运行后min将保持1。由于第二个示例数组中没有大于1的数字,因此它将再次返回1。这可以通过每次调用min时将smallest重置为原始值来修复,或者完全放弃它(见下文)。

分支

这个问题可以通过更少的条件来解决。我们可以使用数组最大值的替代定义,而不是存储最小值:

max({a, b, c, d, e, f}) = max({a, max({b, c, d, e, f})})

看起来更复杂?实际上它不是。我们的想法是,数组的最大值是它的第一个元素的最大值,以及数组中所有剩余元素的最大值。现在可以将其简化为代码。

全部放在一起

static int min(int[] arr)
{
    return minRec(arr, 0);
}

static int minRec(int[] arr, int i)
{
    if(i == arr.length)
        return Integer.MAX_VALUE;

    return Math.min(arr[i], minRec(arr, i + 1));
}

看起来很整洁,不是吗? Math.min(int, int)只是函数的API实现,它返回最少两个参数。