2011-11-23 48 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);