有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

递归Java StackOverflowerr错误的递归调用?

我得到了一组名为“dictionary”的字符串,存储为一个字段,它表示一个单词字典

我将编写一个方法,它接受一个字符串参数(“短语”),并返回一个集合,其中包含字典集合中的所有单词,这些单词可以通过重新排列给定短语中的字符来生成。基本上我是在字典里搜索字谜

这是我的密码:

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. 如果字典确实包含这种可能性,则将其添加到调用结束时返回的名为“anagrams”的集合中。然后再次传递可能性,尝试从中生成其他组合

3。。如果字典不包含该可能性,请修改字符串以尝试其他可能性,然后递归测试这些可能性

上面的代码产生了一个“堆栈溢出错误”,我的研究表明,这意味着我正在进行无限递归,或者一遍又一遍地无限传递相同的字符串。不过,我看不出我在做什么。你能吗


共 (1) 个答案

  1. # 1 楼答案

    public Set<String> getWords(String phrase, String chosen) {
        //...
        if (dictionary.contains(chosen)) {
            anagrams.add(chosen);
            anagrams.addAll(getWords(phrase, chosen)); //< here we are
    

    您正在使用完全相同的参数进行递归调用。并且您不会做任何会使条件下次返回false的事情