I need create a tree structure recursively. In the tree each node has different amount of children, so I think I need to call the method recursively in a for loop. The for loop loops as many times as the current node has children.
The function first creates the leftmost child in depth d and then returns (or is supposed to return) back to the previous depth and creates another and so on. I believe you know what I mean here. So I’m trying to create the whole tree in this way. I have set a base case so that if the conditions of the base case are met, the method isn’t called recursively anymore. The problem is that my program somehow manages to get past those conditions and continues calling the method recursively, though it shouldn’t do that.
Here’s the code:
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));
}
}
}
}
The Node class here isn’t the Java default Node class, but instead a class that belongs to this interface. I know one shouldn’t create a class with a same name that’s already given to some default Java class, but this interface isn’t mine. I just have to implement it. The Node class doesn’t collide with the Java Node class. So I don’t think that causes any problems.
The real problem is that the if((child.getDepth() + 1) < depthLimit) doesn’t seem to have any effect on the program. The program continues calling the method recursively every time until it hits the depth 61 at which point memory runs out. The depth limit is set to 5, but like I said, it doesn’t seem to matter.
The point is that when the program is in the depth “depthLimit -1” it should stop the recursive call and instead set the scores for the children of the current node and then continue doing all those things for the next element that happens to be in turn. Because this method doesn’t return anything (void method), there don’t need to be any return calls, right?
I hope you get the idea what I’m trying to do and what goes wrong. Any help is appreciated. And if you need any more information, please just ask and I’ll try to explain this more carefully.
Thanks in advance.
E: The depthLimit argument in the method is given before the first call and it doesn’t change during the tree creation.
Your problem is not in the part you posted.
I added dummy implementations for all the classes and methods used in your method, and it runs quite fine, stopping at level 6.
(I changed a bit to generic types to avoid compiler warnings.)
Here is the output for depthLimit=4: