使用递归查找数组的最小值?

6

好的,我一直在尝试理解Java中的递归,在简单的任务例如求和、反转等方面取得了一些成就。但是我在尝试做以下练习时遇到了困难:

我正在尝试使用递归在数组中找到最小值,但始终得到0.0的答案。

我的理解是,在递归中需要增加一个元素并提供一个基本情况来结束递归。我认为我在返回值和调用递归方法的最佳时机上有些混淆。

这是我目前的进展:

public static double findMin(double[] numbers, int startIndex, int endIndex) {

double min;
int currentIndex = startIndex++;

if (startIndex == endIndex)
    return numbers[startIndex];

else {
    min = numbers[startIndex];
    if (min > numbers[currentIndex]) {
        min = numbers[currentIndex];
        findMin(numbers, currentIndex, endIndex);
    }
            return min;
}       
} //findMin
4个回答

6
以下是简化版:

以下是简化版:

public static double min(double[] elements, int index) {

  if (index == elements.length - 1) {
    return elements[index];
  }

  double val = min(elements, index + 1);

  if (elements[index] < val)
    return elements[index];
  else
    return val;
}

5
提示:您正在递归调用findMin,但没有使用它的返回值。
整个数组的最小值、第一个元素和除第一个元素外的所有元素的最小值之间有什么关系?

那么,我应该递归调用findMin方法并将返回值分配给...?这就是我困惑的地方。我是否在调用findMin方法之前定义返回值? - Vance

4

这段代码存在多种问题,包括:

  • 你没有使用递归调用 findMin 的结果。
  • startIndex 对于每次调用 findMin 都是相同的,因为在 startIndex 递增之前,currentIndex 被设置为 startIndex 的值。
  • 如果数组中索引1处的数字小于或等于索引0处的数字,则直接返回该数字而不进行递归调用。

那么,在调用递归的findMin方法之前,应该出现return语句吗?此外,我不明白startIndex为什么没有改变。当我调用递归的findMin方法时,我使用带有currentIndex参数的参数(而不是startIndex),这应该作为新的startIndex传递,对吗?我想我开始把自己搞糊涂了 :( - Vance
问题出在 currentIndex = startIndex++ 这一行。当 startIndex 为0时,currentIndex 变成了0,而 startIndex 变成了1。当你调用 findMin 时,你传递给它的是 currentIndex,所以在那个调用中 startIndex 再次变成了0,导致无限递归和堆栈溢出。 - ColinD

1
除了第一个答案外,还有一些观察结果:
  • int currentIndex = startIndex++; - 在这里你会错过第一个元素。通常情况下,你不想修改递归函数的输入。当你准备再次调用函数时,请使用输入并生成新值 - 即“findMin(numbers,currentIndex + 1,endIndex)”

这里不涉及double的默认值,因为在读取之前,min总是被赋予数组中的一个值。实际上,在分配值之前,它不应该被声明。 - ColinD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接