-1

我正在运行一个基于数字输入的数组。它使用递归来查找数组上的最小值。如果用户输入 0,则程序结束。在我处理负数之前它工作正常,比如说我输入 0 2 3 5 3。返回正确,最小的数字将是 0。但是如果我输入 2 9 92 2 -1 0。程序不会在我输入后结束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];
    }
            }
4

2 回答 2

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,但在其他语言中,这样做会导致随机垃圾值。)

于 2013-11-07T19:47:18.743 回答
0

有几个问题。

首先,您没有存储您输入到数组中的第一个数字。存储它,除非它是0.

其次,即使您while在用户输入时跳出循环0,您也已经输入0了数组。0如果这只是为了让用户退出输入过程,请不要输入。

最后,当您不在基本情况下时,您findMinfindMin 两次调用。数组中有 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;
}
于 2013-11-07T19:44:54.307 回答