繁体   English   中英

带有arraylist的递归方法上的stackoverflowerror

[英]stackoverflowerror on recursive method with arraylist

我在线程“主” java.lang.StackOverflowError中看到异常。 我希望知道下面的代码出了什么问题。

public void addWord(String word){
    addWord(word,root,0);
}

private void addWord(String word,Node root,int pos)
{
    for(Node c:root.children)
    {
        if(word.charAt(pos)==c.letter)
        {
            addWord(word,c,pos++);
        }
    }
    Node temp = new Node();
    temp.letter=word.charAt(pos);
    temp.children=new ArrayList<Node>();
    root.children.add(temp);
    if(pos==word.length()-1)
    {
        temp.terminus=true;
        return;
    }
    if(pos<word.length()-1)
    {
        addWord(word,temp,pos++);
    }
}

本质上,堆栈溢出来自以下事实:您的方法一直被递归调用,并且递归永远不会结束。

一个可能的问题是此调用:

addWord(word,temp,pos++);

相当于

addWord(word,temp,pos);
pos = pos + 1;

您可能是说:

addWord(word,temp,++pos);

相当于

pos = pos + 1;
addWord(word,temp,pos);

我写了一个简单的addWord()版本:

private void addWord(String word, Node aRoot, int pos) {

    if (pos == word.length())
        return;

    for (Node c : aRoot.children) {
        if (word.charAt(pos) == c.letter) {
            addWord(word, c, pos+1);
            return;
        }
    }

    Node temp = new Node();
    temp.letter = word.charAt(pos);
    temp.children = new ArrayList<Node>();
    temp.terminus = pos == word.length() - 1;

    aRoot.children.add(temp);
    addWord(word, temp, pos+1);

}

您代码中的原始版本在基本情况和递归调用方面存在一些问题。 通常,应避免更改方法参数的值( pos++部分)。

我猜想您正在构建Trie数据结构,并且我希望您在使用terminus属性时遇到问题。 想想看,如果您添加几个带有共同前缀的单词,那将是终点节点? 您打算在同一级别添加多个具有相同letter节点,还是要在同一级别共享具有相同字母的节点? 在后一种情况下, terminus属性的值是多少?

为了使我的观点清晰明了,请绘制一个图表,显示执行以下代码(密切注意每个节点中的terminus值)后,Trie的外观,并查看上面的实现是否提供了预期的结果。

Test t = new Test();
t.addWord("a");
t.addWord("abc");
t.addWord("ab");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM