为什么堆栈会爆炸

时间:2012-11-30 21:29:34

标签: java

我正在尝试发现从起始节点可到达的所有节点。

似乎永远无法达到基本情况,我不确定原因。

我的代码:

class Vertex {
    public final String name;
    public int found;
    public Edge[] adjacencies;
    public Vertex(String argName) { name = argName; found = 0;}
}

class Edge {
    public final Vertex target;
    public Edge(Vertex argTarget, double argWeight) { target = argTarget; weight = argWeight; }
}

ArrayList<Vertex> merge(ArrayList<Vertex> a, ArrayList<Vertex> b) {
    if(a == null) return b;
    if(b == null) return a;
    for(int x = 0; x < a.size(); x++)
        b.add(a.get(x));
        return b;
}

ArrayList<Vertex> span(Vertex b) {
    System.out.println("hello");
    if(b.found == 1) {
        return null;
    }
    ArrayList<Vertex> t = new ArrayList<Vertex>();
    t.add(b);
    b.found = 0;
    if(b.adjacencies == null) return t;
    for(int x = 0; x < b.adjacencies.length; x++) {
        ArrayList<Vertex> result = span(b.adjacencies[x].target);
        t = merge(t, result);
    }
    return t;
}

我收到了堆栈溢出错误,似乎它在递归中停滞不前,但我不确定原因。

注意:这是我正在运行的图表。

Vertex v0 = new Vertex("Redvile");
Vertex v1 = new Vertex("Blueville");
Vertex v2 = new Vertex("Greenville");
Vertex v3 = new Vertex("Orangeville");
Vertex v4 = new Vertex("Purpleville");

v0.adjacencies = new Edge[]{ new Edge(v1, 5), new Edge(v2, 10), new Edge(v3, 8) };
v1.adjacencies = new Edge[]{ new Edge(v0, 5), new Edge(v2, 3), new Edge(v4, 7) };
v2.adjacencies = new Edge[]{ new Edge(v0, 10), new Edge(v1, 3) };
v3.adjacencies = new Edge[]{ new Edge(v0, 8), new Edge(v4, 2) };
v4.adjacencies = new Edge[]{ new Edge(v1, 7), new Edge(v3, 2) };

2 个答案:

答案 0 :(得分:1)

你永远不会将发现设置为1,你只能将它设置为0而你可能意味着1。 此外,使用布尔值找到。 另外,对ArrayLists使用addAll,并返回Collections.emptyList,而不是null。

答案 1 :(得分:1)

给出这个简单的图表:

VertexA&lt; ---------------&gt; VertexB

顶点A到跨度。发现== 0所以继续,将它添加到t,设置找到= 0,它有一个邻接 - 然后调用span(顶点b)

Vertex B进入span。发现== 0所以继续,将它添加到t,设置找到= 0,它有一个邻接 - 然后调用span(顶点a)

顶点A到跨度。发现== 0所以继续,将它添加到t,设置找到= 0,它有一个邻接 - 然后调用span(顶点b)

我认为问题在于你应该将find设置为1,而不是0。

(将VertexA替换为&#34; Redville&#34;将VertexB替换为&#34; Blueville&#34;以适合您的示例)