2010-10-25 12 views
1

Hey, on m'a demandé d'écrire une recherche binaire récursive pour ma classe de structure de données à l'université, mais j'ai un léger problème. Quand je cherche un nombre qui est hors limites (plus de 10 dans ce cas) il jette une exception hors limites. Je comprends pourquoi il le fait, parce que le tableau n'a pas plus de 10 espaces, mais je ne sais pas comment le contourner. Des idées?La recherche binaire récursive Java jette hors des limites l'exception?

Le tableau qui effectue une recherche est un tableau ordonné 1 - 10 (index 0 - 9).

public int recursiveBinarySearch(int[] anArray, int searchedNumber, int min, int max) { 

    if (min > max) 
     { 
       System.out.println(searchedNumber + " is not present in tha array."); 
       //return -1 to show that the value has not been found 
     return -1; 
     } 
     // find the centre of the array 
     int centre = (min + max)/2; 

    if (anArray[centre] == searchedNumber) 
     { 
       System.out.println(searchedNumber + " was found at index " + centre); 
     return centre; 
     } 

     if (anArray[centre] < searchedNumber) 
     { 
     return recursiveBinarySearch(anArray, searchedNumber, centre+1, max); 
     } 

     return recursiveBinarySearch(anArray, searchedNumber, min, centre-1); 

} 
+1

La recherche binaire ne doit pas utiliser/2 il faut utiliser le bitwise >>. – Woot4Moo

+0

En fait, il devrait utiliser >>>. – helpermethod

+1

Pourquoi? Peu importe à quoi ressemblent les bits. Vous vous souciez de ce que le nombre est (et quelle est la moitié de celui-ci). Ce type d'optimisation devrait être laissé au compilateur/jvm. – ILMTitan

Répondre

1
public int recursiveBinarySearch(...) { 
    if (max >= array.length) { 
     max = array.length - 1; 
    } 
    if (min < 0) { 
     min = 0; 
    } 
    ... rest of the code 
} 

PS ne pas être un nagger, mais je recommande également d'utiliser indentation cohérente. Croyez-moi, cela aide grandement à écrire des programmes sans bug.

+0

Merci beaucoup, c'est exactement ce dont j'avais besoin. En ce qui concerne l'indentation, merci de le signaler, le reste de mon programme est indenté .. juste pas cette méthode pour une raison quelconque. Merci encore beaucoup. – Rvddps

0

Je suppose que cela commence par min = 0 et max = 9, il va

min = 0, max = 9, c = (0+9/2) = 4 
min = 5, max = 9, c = (6+9/2) = 7 
min = 8, max = 9, c = (8+9/2) = 8 
min = 9, max = 9, c = (9+9/2) = 9 
min = 10, max = 9, ... 

Comme vous pouvez le voir se sur la limite, min = 10 volonté de causer des problèmes de cours. Pour éviter que la condition d'élargir simplement initial:

if (min > max || min > Array.length -1 || max < 0) 
    // not found! 

de sorte que si vous allez sur le tableau dans l'une des deux directions alors l'élément demandé ne sera pas trouvé.

+0

Pourquoi cela va-t-il causer des problèmes? Il en prend soin dans 'if (min> max)' – codaddict