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

4 回答 4

5

提示:您正在findMin递归调用,但不使用它的返回值。

(1) 整个数组的最小值、(2) 第一个元素和 (3) 除了第一个元素之外的所有元素的最小值之间的关系是什么?

于 2011-04-08T22:06:09.487 回答
5

这是一个简化版本:

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;
}
于 2011-04-08T23:23:34.723 回答
4

这段代码有很多问题,包括:

  • 您不使用递归findMin调用的结果。
  • startIndex每次调用都将是相同的findMin,因为currentIndex被设置为startIndex before startIndex的值会增加。
  • 如果数组中索引 1 处的数字 <= 索引 0 处的数字,则您只需返回该数字,甚至无需进行递归调用。
于 2011-04-08T22:12:55.867 回答
1

除了第一个答案之外,还有一些观察:

  • int currentIndex = startIndex++; - 你会在这里错过你的第一个元素。通常,您不想修改递归函数的输入。当您准备好再次调用该函数时,处理输入并生成新值 - 即“findMin(numbers, currentIndex+1, endIndex)”
于 2011-04-08T22:10:39.113 回答