繁体   English   中英

递归算法和StackOverFlow错误

[英]Recursive algorithms and StackOverFlow Error

我一直在编写一个递归算法,以遍历不同的节点并分析有向无环图中的所有路径。 事实是,在将一些新数据引入算法后,我Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError得到了此消息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)))但我不明白为什么它可以处理某些数据,但并非总是如此,因为没有太多信息被更改。

任何意见,建议将是真正有帮助的。 谢谢大家

发生StackOverflowError的原因是递归次数过多。 如果递归调用过多,则意味着终止条件存在缺陷或错误的假设。 这是您的终止条件:

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

由于您没有为我们的问题提供足够的信息来进一步分析图或节点,因此建议您仔细研究此终止条件,并确保图的所有遍历最终都将满足此条件。

使用调试器还可以帮助您逐步遍历遍历,查看循环发生在何处以及为什么循环无法满足最终条件。

由于遍历每个节点的重复次数,访问了多少次并通过添加一些maxRep来限制工作量,因此图形遍历效率似乎较低

您所需要的只是访问的节点集,而不是访问节点时每个节点的计数器增量。

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

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

暂无
暂无

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

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