在数组上输入负数

时间:2013-11-07 19:29:56

标签: java arrays if-statement recursion

我正在运行一个基于数字输入的数组。它使用递归来查找数组上的最小数。如果用户输入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];
    }
            }

2 个答案:

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