2015-02-18 2 views
1

Так как название предлагает, я пишу код для выполнения версии бинарного поиска в Java. Тем не менее, мои обратные утверждения игнорируются, и функция вместо возвращает последний «поймать всех» оператор возврата, как показано ниже:Возврат Java двоичного поиска игнорируется

public int binarySearch(int min, int max) { 

     int mid = ((min+max)/2); 
     double[][] m1 = createFilledSquareMatrix(mid); 
     double[][] m2 = createFilledSquareMatrix(mid); 
     double[][] m3 = new double[mid][mid]; 
     long time = analyzeMultiply(m1, m2, m3); 
     if(time == 1000) { 
      return mid; 
     } 
     if (time > 1000) { 

      m1 = createFilledSquareMatrix(mid-1); 
      m2 = createFilledSquareMatrix(mid-1); 
      m3 = new double[mid-1][mid-1]; 
      time = analyzeMultiply(m1, m2, m3); 
      if(time <= 1000) { 
       return mid; //I am reached but ignored 
      } 
      else { 
       binarySearch(min, mid-1); 
      } 
     } 
     else { 
      System.out.println("here"); 
      m1 = createFilledSquareMatrix(mid+1); 
      m2 = createFilledSquareMatrix(mid+1); 
      m3 = new double[mid+1][mid+1]; 
      time = analyzeMultiply(m1, m2, m3); 
      if(time >= 1000) { 
       return mid+1; //I am reached but ignored 
      } 
      else { 
       binarySearch(mid+1, max); 
      } 
     } 

    return -2; 

} 

Так я прокомментировал заявление возвращения, которые игнорируются. Я прохожу через отладчик, и он выполняет возврат, но затем просто переходит к инструкции return return -2, а затем выполняет это. У меня никогда не было такого типа проблем, поэтому я чувствую, что мне не хватает чего-то простого. Любая помощь будет оценена по достоинству.

ответ

4

Ваш метод рекурсивный. Это означает, что каждый раз, когда вы рекурсируете, вам нужно что-то сделать с возвращаемым значением из рекурсивного вызова. То, что вы видите, это то, что рекурсивные вызовы достигают точки окончания, возвращают значение и затем выходят из строя. Однако, поскольку экземпляр, который сделал рекурсивный вызов, ничего не делает с возвращаемым значением, он продолжает выполняться так, как будто ничего не произошло, заставляя его вернуться к его возврату «catch all» и т. Д.

Например,

else { 
      binarySearch(min, mid-1); 
     } 

должно быть

else { 
      return binarySearch(min, mid-1); 
     } 
Смежные вопросы