Мне нужно рекурсивно создать древовидную структуру. В дереве каждый узел имеет разное количество дочерних элементов, поэтому я думаю, что мне нужно рекурсивно вызывать метод в цикле 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 - это не класс Node по умолчанию для Java, а класс, принадлежащий этому интерфейсу. Я знаю, что нельзя создавать класс с тем же именем, которое уже дано некоторому классу Java по умолчанию, но этот интерфейс не мой. Я просто должен это реализовать. Класс Node не конфликтует с классом Java Node. Поэтому я не думаю, что это вызывает какие-либо проблемы.
Реальная проблема заключается в том, что if ((child.getDepth () + 1) , похоже, не влияет на программу. Программа продолжает вызывать метод рекурсивно каждый раз, пока он не достигнет глубины 61, в которой память заканчивается. Ограничение глубины установлено на 5, но, как я уже сказал, это не имеет значения.
Дело в том, что когда программа находится в глубине "deepLimit -1" , она должна прекратить рекурсивный вызов и вместо этого установить оценки для дочерних элементов текущего узла, а затем продолжить делать все эти вещи для следующего элемента, который оказывается в очереди. Поскольку этот метод ничего не возвращает (метод void), не требуется никаких обратных вызовов, верно?
Надеюсь, вы поняли, что я пытаюсь сделать и что идет не так. Любая помощь приветствуется. А если вам нужна дополнительная информация, просто спросите, и я постараюсь объяснить это более внимательно.
Заранее спасибо.
E: Аргумент deepLimit в методе перед первым вызовом не изменяется при создании дерева.