【发布时间】:2011-03-08 19:47:16
【问题描述】:
我需要递归地创建一个树结构。在树中,每个节点都有不同数量的子节点,所以我认为我需要在 for 循环中递归调用该方法。 for 循环的循环次数与当前节点有多少子节点一样多。
该函数首先在深度 d 中创建最左边的孩子,然后返回(或应该返回)到前一个深度并创建另一个,依此类推。我相信你知道我在这里的意思。所以我试图以这种方式创建整个树。我已经设置了一个基本情况,以便如果满足基本情况的条件,则不再递归调用该方法。问题是我的程序以某种方式设法克服了这些条件并继续递归调用该方法,尽管它不应该这样做。
代码如下:
private void makeTree(GameState prevState, Vector moves, Node parentNode, int index, int depthLimit) {
if(prevState.getPossibleMoveCount(index) != 0){
for(int i = 0; i < moves.size(); i++){
Move thisMove = (Move)moves.get(i);
GameState newState = prevState.getNewInstance(thisMove);
Node child = new Node(newState, thisMove);
parentNode.addChild(child);
child.setParent(parentNode);
if((child.getDepth() + 1) < depthLimit){
int newIndex = switchIndex(index);
Vector newMoves = newState.getPossibleMoves(newIndex);
makeTree(newState, newMoves, child, newIndex, depthLimit);
}else{
child.setScore(newState.getMarkCount(index));
}
}
}
}
这里的 Node 类不是 Java 默认的 Node 类,而是属于这个接口的一个类。我知道不应该创建一个与某个默认 Java 类具有相同名称的类,但这个接口不是我的。我只需要实现它。 Node 类不会与 Java Node 类发生冲突。所以我认为这不会造成任何问题。
真正的问题是 if((child.getDepth() + 1) 似乎对程序没有任何影响。程序每次都继续递归调用该方法,直到它到达深度 61,此时内存耗尽。深度限制设置为 5,但就像我说的,这似乎无关紧要。
关键是当程序处于深度“depthLimit -1”时,它应该停止递归调用,而是为当前节点的子节点设置分数,然后继续执行所有这些操作恰好是下一个元素的事情。因为这个方法不返回任何东西(void 方法),所以不需要任何返回调用,对吧?
我希望你明白我想要做什么以及出了什么问题。任何帮助表示赞赏。如果您需要更多信息,请尽管询问,我会尝试更仔细地解释这一点。
提前致谢。
E:方法中的 depthLimit 参数在第一次调用之前给出,并且在树创建期间不会更改。
【问题讨论】:
-
你试过用调试器运行它,看看为什么会出错吗?另外,如果是家庭作业,请用 homework 标记它
-
循环中似乎没有任何地方为孩子分配深度,大概是 child.getDepth() 总是返回 0?
-
你是否在某处增加了节点的深度?
-
接口文档说Node会自动跟踪深度。它没有说明节点是如何做到这一点的,但在实际代码中我有一些调试打印打印节点的深度,它似乎工作。
-
我不知道有一个 Java 默认 Node 类 ...您的意思是接口
javax.xml.soap.Node或org.w3c.dom.Node之一吗?只要您不在同一个程序中使用这些 API,就不必担心,Node是一个过于笼统的名称,无法保留给 XML 处理 API。