2013-11-07 4 views
-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]; 
    } 
      } 
+7

красивый обратный отступы –

+0

Этот код не компилируется. –

+0

Пожалуйста, старайтесь придерживаться основных правил кода: правильный отступ (возможно, встроенная функция для вашего редактора), camelCase для локальных переменных, включая массивы и т. Д. Также он «не заканчивается» (ничего не печатает) или делает это крушение? С рекурсией вы быстро получите StackOverflowException. – Zong

ответ

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

Проблема заключается в том, что ваш рекурсивный метод вызывает себя дважды. Если вы вызываете его с массивом из 100 элементов, то он будет вызывать себя дважды с под-массивом из 99 элементов; который будет называть себя дважды с подматрицей из 98 элементов, каждый раз, когда называется, всего 4 раза; и так далее. В результате метод будет называться 2^100 раз (от 2 до 100-й мощности) !! Или, может быть, это 2^99 или 2^101, я не проверял. Но это много. Вот почему ваша программа не останавливается, если в массиве есть отрицательное число.

Чтобы решить эту проблему, перестройте свой код для вызова findMin только один раз и назначьте ему переменную, а затем используйте значение переменной.

Другие проблемы: когда main вызывает findMain, он называет его 0 и 99 в качестве границ, даже если вы не ввели столько чисел. Верхняя граница должна быть исправлена. Наконец, если вы пройдете через код, вы увидите, что main никогда не устанавливает NumArray[0]; первый элемент, который он устанавливает, - NumArray[1]. Но значение (неинициализированное) все еще используется при поиске минимума. (Я думаю, что он всегда будет 0, на Java, но на других языках выполнение чего-то подобного приведет к случайному значению мусора.)

Смежные вопросы