2017-06-03 4 views
0

Mon code est ci-dessous, j'essaie d'appeler de manière récursive ma fonction de recherche binaire mais continue d'obtenir cette exception. J'essaie d'identifier la source du problème. Gardez à l'esprit que j'ai exclu mon code pour la création de la liste de tableaux pour la simplicité et parce que je sais qu'ils sont fonctionnels.Identification de l'exception dans le thread "principal" java.lang.StackOverflowError

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.math.*; 
public class nickclass { 

public static void main(String[] args) { 

for(int i = 0; i <(int)listTest.size();i++) 
    { 
    binarySearchHelp(listTest2,(String)listTest.get(i),0,listTest2.size()); 
} 

void binarySearchHelp(ArrayList list, String value, int left, int right) { 

    if (left > right) 
     System.exit(0); 

    int middle = (int) Math.floor(list.size()/2); 

    if (((String) list.get(middle)).compareTo(value) == 0) 
     System.out.println(list.get(middle)); 


    else if (((String) list.get(middle)).compareTo(value) > 0) 
     binarySearchHelp(list, value, left, middle - 1); 

    else 
     binarySearchHelp(list, value, middle + 1, right);   

    } 
} 
} 

Répondre

1

L'appel récursif est jamais terminaison (uniquement lorsque toute la mémoire est utilisée) car middle est toujours au milieu de la liste, mais il devrait être au milieu entre gauche et droite:

middle = (left + right)/2; 

Je voudrais aussi vérifier que l'intervalle (gauche-droite) est assez grand pour être divisé ou si l'algorithme peut s'arrêter ... et System.exit est plutôt brutal, vous voulez vraiment arrêter la machine virtuelle sans aucun message?

+0

Quelle est la meilleure méthode pour mettre fin à la fonction récursive? – Destreation

+0

c'est une erreur si 'left' est plus grand que' right', donc je lancerais une exception - 'IllegalArgumentException' dans ce cas –

+0

Oui mais si c'est égal au milieu et que je l'imprime, comment quitter la fonction? – Destreation