2011-04-08 73 views
5

好的,所以我一直试图围绕Java递归,并且我可以完成诸如sum,reversing等简单任务,但我一直在努力做这个练习:使用递归寻找数组的最小值?

我试图使用递归找到数组中的最小数字,但不断得到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

有这个代码的各种问题,包括:

  • 您不使用递归findMin调用的结果。
  • startIndex将是每次调用findMin一样,因为currentIndex被设置为startIndexstartIndex递增之前。
  • 如果数组中索引为1的数字是< =索引为0的数字,则只需返回该数字即使不进行递归调用。
+0

那么,在我调用递归findMin方法之前,是否应该返回语句呢?另外,我不了解startIndex是如何改变的。当我调用递归findMin方法时,我使用currentIndex(而不是startIndex)参数,然后应该将其作为新的startIndex传递,是正确的吗?我认为我开始迷惑自己:( – Vance 2011-04-08 22:39:46

+0

@ user699302:问题是'currentIndex = startIndex ++'。当'startIndex'为0时,'currentIndex'变为0,'startIndex'变为1.当您调用'findMin' ,你把它传递给'currentIndex',所以在那个调用中'startIndex'将会再次变为0,导致无限递归和堆栈溢出。 – ColinD 2011-04-09 01:27:41

5

提示:你打电话findMin递归,但随后没有使用它的返回值。

(1)整个阵列的最小值,(2)第一个元素和(3)除第一个元素以外的所有项的最小值之间的关系是什么?

+0

所以,我应该递归调用的findMin方法和返回值赋给...?这是我困惑的地方。在调用findMin方法之前是否定义了返回值? – Vance 2011-04-08 22:43:15

1

除了第一回答几个意见:

  • int currentIndex = startIndex++; - 你要错过这里的第一要素。一般来说,你不想修改递归函数的输入。工作输入OFF,当你准备好再次调用该函数产生新的价值 - 即“findMin(数字,CURRENTINDEX + 1,endIndex的)”
+0

'double'的默认值不会在这里播放,因为'min'在读取之前总是从数组中分配一个值。真的,它不应该被宣布,直到它被分配的点。 – ColinD 2011-04-08 22:14:50

+0

哎呀,我的错误,误解了分钟的位置。谢谢 – dfb 2011-04-08 22:15:49

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; 
}