我正在运行一个基于数字输入的数组。它使用递归来查找数组上的最小数。如果用户输入0,则程序结束。它工作正常,直到我处理负数让我说我输入0 2 3 5 3.返回正确,最低数字将是0.但如果我输入2 9 92 2 -1 0.程序不会一旦我输入结束因此,它不显示-1作为最小数。任何建议或帮助。
import java.io.*;
import java.text.*;
public class Assignment9
{
public static void main (String args[]) throws IOException
{
int i = 0;
double[] NumArray;
NumArray = new double[100];
// input stream reader reads in keyboard inputs, while buffered reader
// reads in the line as a string15.
InputStreamReader inRead = new InputStreamReader(System.in);
BufferedReader buffRead = new BufferedReader(inRead);
String line = buffRead.readLine();
// if the string is equal to 0 and is false AND i is less than22.
// 100, parse string into double.23.
try
{
while (line.equals("0") == false && i<100)
{
i++;
line = buffRead.readLine();
NumArray[i]=Double.parseDouble(line);
}
}
catch(IOException e)
{
System.out.println("Array index out of bound");
}
double min = findMin(NumArray, 0, NumArray.length - 1);
System.out.print ("The minimum number is " + min + ('\n'));
public static double findMin(double[] NumArray, int startIndex, int endIndex)
{
if (startIndex == endIndex)
{
return NumArray[startIndex];
}
else if(findMin(NumArray, startIndex, endIndex - 1) < NumArray[endIndex])
{
return findMin(NumArray, startIndex, endIndex -1 );
}
else
{
return NumArray[endIndex];
}
}
答案 0 :(得分:0)
有一些问题。
首先,您没有将输入的第一个数字存储到数组中。存储它,除非它是0
。
其次,即使您在用户输入while
时突破0
循环,您也已将0
输入数组。如果只是为了让用户退出输入过程,请不要输入0
。
最后,当您不在基本情况时,您从findMin
两次致电findMin
。数组中有100个元素,因此您最多可以findMin
次调用2^100
次!
存储递归调用的结果,因此每次递归只调用一次。变化
if (startIndex == endIndex)
{
return NumArray[startIndex];
}
else if(findMin(NumArray, startIndex, endIndex - 1) < NumArray[endIndex])
{
return findMin(NumArray, startIndex, endIndex -1 );
}
到
double min;
if (startIndex == endIndex)
{
return NumArray[startIndex];
else if((min = findMin(NumArray, startIndex, endIndex - 1)) < NumArray[endIndex])
{
return min;
}
答案 1 :(得分:0)
问题是你的递归方法会自己调用两次。如果用100个元素的数组调用它,那么它将使用99个元素的子数组调用自己两次;这将使用98个元素的子数组调用自己两次,每次调用它,共计4次;等等。结果是该方法将被调用2 ^ 100次(2到100次幂)!!或者它可能是2 ^ 99或2 ^ 101,我还没有检查过。但这是一个很大的问题。这就是为什么如果数组中有负数,你的程序就不会停止。
要解决此问题,请重新排列代码以仅调用findMin
一次,并为其分配变量,然后使用变量的值。
其他问题:当main
调用findMain
时,即使您没有输入那么多数字,它也会以0和99作为边界来调用它。上限需要修复。最后,如果您浏览代码,您会看到main
从未设置NumArray[0]
;它设置的第一个元素是NumArray[1]
。但是(未初始化的)值仍然用于寻找最小值。 (我认为在Java中它总是0,但在其他语言中做这样的事情会导致随机的垃圾值。)