我正在尝试创建一种方法,使用递归搜索一维数组的最小值。它确实给了我一个输出,但它总是" 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
答案 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实现,它返回最少两个参数。