2014-11-09 2 views
3

Я кодирую алгоритм двоичного поиска, и я хочу получить минимальные догадки подсчета, чтобы найти номер, который я предоставляю. Предположим, что число, которое я предоставляю, равно 33, тогда оно должно считаться 7 шаги.двоичный поиск числа угадывания рекурсивно

Step no  number guessed result  range of possible values 
0             1-100 
1    50   too high    1-49 
2    25   too low    26-49 
3    37   too high    26-36 
4    31   too low    32-36 
5    34   too high    32-33 
6    32   too low    33-33 
7    33   correct 

это мой код для этого

package binarySearch; 

public class Binary { 

    int gussedNo; 
    public static int count =0; 

    void search(int lowerBound,int upperBound,int num){ 
     gussedNo=upperBound+lowerBound/2; 
     count(); 
     if(gussedNo==num){ 
      System.out.println(count);} 
      else if(gussedNo>num){ 

       upperBound=gussedNo-1; 

       search(lowerBound,upperBound,num); 

       } 
      if(gussedNo<num){ 

       lowerBound=gussedNo+1; 
       search(lowerBound,upperBound,num); 




     } 

     } 
    int count(){ 
     count=count+1; 
     return count; 
    } 

} 

Я создал отдельный метод. вот мой мой основной класс ..

package binarySearch; 

public class MainClass { 
    public static void main (String[] args){ 

     Binary search= new Binary(); 

     search.search(1, 100,33); 

    } 
} 

Здесь я дал LowerBound как 1 и uperbound 100, а число я хочу считать догадки для него 33. Но когда я выполняю код, который я получаю считаются 68..but это должно быть 7 в соответствии с бинарным поиском

+0

«на ** минимум ** догадок «для любого числа всегда 1. –

ответ

3

Посмотрите на строку, в которой вы создаете следующую догадку:

gussedNo=upperBound+lowerBound/2; 

Благодаря математическому операторов старшинства в Java, эта линия является такие как имеющие:

gussedNo=upperBound+(lowerBound/2); 

Это явно не выполняет двоичный поиск и, следовательно, не то, что вы хотели. Вы можете решить эту проблему путем явного добавления скобок:

gussedNo = (upperBound + lowerBound)/2; 
+0

большое спасибо. Это была проблема :) – jan

1

вот ваша проблема gussedNo=upperBound+lowerBound/2;

Вы забыли Abour operatots заказать выполнение должно быть gussedNo=(upperBound+lowerBound)/2;