Java StackOverFlowError - Плохой рекурсивный вызов? - PullRequest
2 голосов
/ 22 февраля 2011

Мне дан набор строк под названием «словарь», хранящийся в виде поля, представляющего словарь слов.

Я должен написать метод, который принимает параметр String («фразу») и возвращает набор, содержащий все слова в наборе словарей, которые могут быть сделаны путем перестановки символов в данной фразе. В основном я ищу в словаре анаграммы.

Вот мой код:

public Set<String> getWords(String phrase) {
    Set<String> anagrams = new TreeSet<String>();
    String chosen = "";
    anagrams.addAll(getWords(phrase, chosen));
    return anagrams;
}

public Set<String> getWords(String phrase, String chosen) {
    if (phrase == null) {
        throw new IllegalArgumentException();
    } 
    Set<String> anagrams = new TreeSet<String>();
    if (dictionary.contains(chosen)) {
        anagrams.add(chosen);
        anagrams.addAll(getWords(phrase, chosen));
    } else {
        for (int i = 0; i < phrase.length(); i++) {
            String ch = phrase.substring(i, i + 1);         
            String temp = phrase.substring(0, i) + phrase.substring(i + 1);
            anagrams.addAll(getWords(temp, chosen + ch));
        }
    }
    return anagrams;
}    

Так что мой подход заключается в следующем: 1. Проверьте словарь на предмет возможности, переданной в этой теме, представленной переменной «selected».

  1. Если словарь содержит такую ​​возможность, добавьте его в набор, называемый «анаграммы», который возвращается в конце вызова. Затем пропустите возможность снова попытаться сделать из нее другие комбинации.

3 .. Если словарь не содержит возможности, измените строку, чтобы попробовать другие возможности, которые затем проверяются рекурсивно.

Приведенный выше код выдает «ошибку переполнения стека», что, как показывает мое исследование, означает, что я выполняю бесконечную рекурсию или повторяю одну и ту же строку снова и снова бесконечно. Хотя я не вижу, где я это делаю. Вы можете?

1 Ответ

8 голосов
/ 22 февраля 2011
public Set<String> getWords(String phrase, String chosen) {
    //...
    if (dictionary.contains(chosen)) {
        anagrams.add(chosen);
        anagrams.addAll(getWords(phrase, chosen)); //<--here we are

Вы делаете рекурсивный вызов с точно такими же параметрами.И вы ничего не сделаете, чтобы в следующий раз условие вернулось false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...