2011-11-23 35 views
0

遞歸函數調用在達到限制後突然發生了故障。用於使用n元樹節點的循環遞歸

當從main調用函數時,首先傳遞根節點,然後在循環中檢查根節點的子節點的大小值,並遞歸調用該子節點上的相同函數以設置其大小值。

我的輸入是很大的樹。當我在設置樹中元素的大小之前打印n-ary樹時,列表將獲得所有元素的打印。但是在setsize()遞歸過程中,執行會在一個特定的點上無意義地掛起。每次執行都停止在同一個元素上。如果我在創建n元樹時從元素中刪除元素後掛起的元素,則執行成功並且不會掛起。

我試着增加-Xss -Xmx -Xss。仍然沒有用。

我必須使用線程或請讓我知道是否有任何問題在我的下面的遞歸方法爲上面解釋的函數實現。謝謝!!

public void setsize(Element inEle){ 
     for(int i =0;i<inEle.children.size();i++){ 
      if(inEle.children.get(i).size==0) 
      {     
       this.setsize(inEle.children.get(i)); 
       i--; 
      }else 
      { 
       if(!inEle.children.get(i).isRedefine) 
        inEle.size=inEle.size+inEle.children.get(i).size;     
      } 
     } 
     inEle.size=inEle.size*inEle.occurs; 
    } 
+0

什麼是應該代表元素的'size'?它下面的元素數量? – corsiKa

回答

0

我認爲在相同條件下出毛病i++i--

注意:遞歸調用保存本地變量的狀態,所以不要自己嘗試。

+0

'我 - - '看起來像這樣做,以便它可以再次運行該循環的迭代,以便它可以準確地處理孩子。 – corsiKa

0

通過這條線來判斷,inEle.size=inEle.size+inEle.children.get(i).size;它看起來像一個元素的大小是它下面的大小的總和。我看到的問題是,從來沒有任何地方可以開始。因此,讓我們假設它正在計算節點,然後您可以將實際計算更改爲任何您想要的值。

我會做的第一件事是改變setSize方法也返回大小以及設置。因此,如下

public int setSize(Element parent) { 
    int size = 0; 
    for(Element child : parent.children()) { // enhanced for loop 
     size += setSize(child); 
    } 
    parent.size = size + 1; // the +1 is the current node 
    return size; 
} 

然後,你可以把它放在根:

int treeSize = setSize(root);