递归算法和StackOverFlow错误

时间:2017-03-14 10:55:33

标签: java recursion stack-overflow

我一直在编写递归算法,以便遍历不同的节点并分析有向无环图中的所有路径。问题是,在对算法引入一些新数据之后,我得到了这条消息Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError。我已经查看了有关此问题的不同问题,似乎错误是因为内存不足。有谁能帮我解决这个问题?

这里我添加了递归算法的图片:

public boolean checkduration(Node node, double dur, int freq){
    boolean outcome=true;
    currentPath.add(node);
    if((dur>minduration)&&(node.getRep()<=node.getMaxRep())){
        ArrayList<Node> clone = (ArrayList<Node>) currentPath.clone();
        currentPath2=clone;
        failingPaths.add(new ImmutableTriple<Double,Integer, ArrayList<Node>> (dur,freq,currentPath2)); 
        currentPath.remove(node);
        return false;
    }
    node.setRep(node.getRep()+1);

    for(int i=0;i<node.getEdge().size();i++){
        if(!checkduration(node.getEdge().get(i).previousNode,dur+node.getEdge().get(i).timeRelation, freq+node.getEdge().get(i).frequency)){
            outcome=false;  
        }
    }
    currentPath.remove(node);
    node.setRep(node.getRep()-1);
    return outcome;
 }

错误似乎是在(if(!checkduration(node.getEdge().get(i).previousNode,dur+node.getEdge().get(i).timeRelation, freq+node.getEdge().get(i).frequency)))的情况下,但我不明白为什么它适用于某些数据,并不总是因为没有那么多信息被更改。

任何评论,建议都会对您有所帮助。谢谢大家

2 个答案:

答案 0 :(得分:0)

发生StackOverflowError是因为您递归的次数太多了。如果有太多的递归调用,这意味着在终止条件中存在缺陷或不正确的假设。这是你的终止条件:

(dur > minduration) && (node.getRep() <= node.getMaxRep())

由于您没有提供足够的信息以便我们进一步分析您的图形或节点,我建议您仔细查看此终止条件,并确保图形的每次遍历最终都会满足此条件

使用调试器还可以帮助您逐步完成遍历并查看周期发生的位置,以及它无法满足终端条件的原因。

答案 1 :(得分:0)

您的图表遍历似乎效率低下,因为您计算每个节点的重复次数,访问次数以及通过添加一些 maxRep 来限制您的工作量

当您访问它时,您只需要一组访问过的节点,而不是为每个节点增加一个计数器。

你的DAG有很多根吗?缺乏周期保证,还是需要检测周期?

另请注意,您不需要克隆路径。