2017-09-01 2 views
0

Ceci est ma logique pour la recherche binaire et quand j'essaie de l'exécuter il donne moi erreur de stackoverflow .... J'ai écrit la condition de base aussi. Où est le point d'erreur exact en elle. Pour ce code, j'ai pris un tableau global avec une valeur prédéfinie et donné initialIndex = 0 initialement et lastIndex = intArray.length-1;Pourquoi cette fonction récursive lance l'erreur StackOverFlow ??? c'est ma logique pour la recherche binaire et Où est le point d'erreur exact

public static void binarySearchInteger(int searchingElement,int 
    startingIndex,int lastIndex) { 
    middleIndex=(startingIndex+lastIndex)/2; 
    if(searchingElement==intArray[middleIndex]) 
     System.out.println("Found the Element"); 
    else if(startingIndex==lastIndex&& 
          searchingElement!=intArray[middleIndex]) 
     System.out.println("There is no such Element"); 
    else { 
     if(intArray[middleIndex]>searchingElement) 
      binarySearchInteger(searchingElement, 
              startingIndex,middleIndex); 
     else 
      binarySearchInteger(searchingElement,middleIndex,lastIndex); 
    }   
} 
+1

Quelles sont vos valeurs? avez-vous débuggé? Quelle est la taille de votre tableau? – Stultuske

+4

Votre tableau est-il trié? – Eran

+0

Déboguez votre code. – f1sh

Répondre

1

Supposons startIndex == 0 et endIndex == 1, puis middleIndex est réglé sur 1/2 == 0 (division entière). Maintenant startIndex == middleIndex, donc votre dernier appel récursif peut utiliser la même méthode avec les mêmes valeurs de paramètre et provoquer une récursion infinie, ce qui conduira à un débordement de pile.

Puisque vous comparez avec déjà l'élément central, vous n'avez pas besoin d'inclure l'élément central dans les recherches récursives, remplacez donc le dernier appel récursif:

binarySearchInteger(searchingElement,middleIndex + 1,lastIndex); 

Il pourrait y avoir plus d'erreurs dans votre code, mais celui que j'ai trouvé en le regardant seulement. Vous pouvez trouver des erreurs vous-même en utilisant un débogueur et en parcourant votre code, en regardant exactement ce qui se passe.