2012-11-30 233 views
-1

我正在嘗試發現從一個起始節點可到達的所有節點。爲什麼堆棧炸燬

似乎基本案例從未達成,我不知道爲什麼。

我的代碼:

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

運行。 – djechlin

+0

@djechlin我完全同意。 –

+0

它在合併操作上卡住了嗎?圖創建應該沒問題。 – djjeck

回答

1

你從來沒有發現1,你只將其設置爲0,而你可能是指1. 此外,使用布爾的發現。 另外,使用addAll作爲ArrayLists,並返回Collections.emptyList,而不是null。

+0

你是對的,錯字!謝謝! –

1

鑑於這種簡單的圖形:

VertexA < ---------------> VertexB

頂點A到跨度。找到== 0所以繼續,將它添加到t,設置found = 0,它有一個鄰接 - 然後調用跨度(頂點b)

頂點B跨度。找到== 0所以繼續,將它添加到t,設置found = 0,它有一個鄰接 - 然後調用跨度(頂點a)

頂點A跨度。發現== 0這樣繼續下去,將其添加到T,集中找到= 0,它有一個鄰居 - 然後調用跨度(頂點B)

的問題,我相信,是你要被設定發現1,而不是0。

(用「Redville」和VertexB用「Blueville」替換VertexA以適合你的例子)在調試器