#java #recursion #break
#java #рекурсия #перерыв
Вопрос:
Есть ли способ резко вернуться к методу, который вызывает метод ниже, когда условие выполнено? Что-то похожее на разрыв циклов.
public void createTree(TreeNode tree) throws IOException {
if (i >= preorder.length) {
// Leave recursive method
} else if (preorder[i] == '0') {
tree.value = '0';
tree.left = tree.right = null;
i ;
} else {
tree.value = preorder[i];
i ;
tree.left = new TreeNode();
createTree(tree.left);
tree.right = new TreeNode();
createTree(tree.right);
}
}
Спасибо.
Комментарии:
1. Вы действительно хотите прервать где-либо свою рекурсию? (т.е. tree.right == null)
2. Что именно вы подразумеваете под «внезапным завершением»? Завершите текущую часть рекурсии и позвольте остальным продолжаться? Или завершить весь рекурсивный вызов и вернуться к нерекурсивной части вашего кода?
3. @Joachim Sauer: Есть ли способ заставить метод возвращаться без выполнения оставшихся рекурсий?
4. Просто для ясности: если это условие выполняется
true
, то это какое-то условие ошибки, и весь рекурсивный вызов можно считать «неправильным» или «ненужным» в некотором роде. Это верно?5. @Joachim Sauer: Это не совсем ошибка, но это условие для проверки того, когда все элементы preorder [i] были пройдены и больше рекурсий не требуется, если это имеет смысл. Я пока не очень хорошо разбираюсь в языке программирования, поэтому мое объяснение может быть плохим.
Ответ №1:
Вы можете просто позволить методу вернуть. Затем рекурсия пойдет в обратном направлении, и будут выполнены остальные инструкции.
Комментарии:
1. 1 общий принцип рекурсии заключается в том, что рекурсивный метод возвращает значение базового регистра в некоторый момент.
2. Есть ли способ сделать это без выполнения оставшихся инструкций?
3. Если
return
находится в своем собственном маленькомif
блоке, не должно быть никаких оставшихся операторов.
Ответ №2:
Вы могли бы вернуть статус из метода :
/**
* @return false if the recursion has been aborted
*/
public boolean createTree(TreeNode tree) throws IOException {
if (i >= preorder.length) {
return false;
}
else if (preorder[i] == '0') {
tree.value = '0';
tree.left = tree.right = null;
i ;
}
else {
tree.value = preorder[i];
i ;
tree.left = new TreeNode();
if (!createTree(tree.left)) {
return false;
};
tree.right = new TreeNode();
if (!createTree(tree.right)) {
return false;
}
}
}
Комментарии:
1. Большое вам спасибо! На самом деле это непреднамеренно решило и другую проблему в моем коде. 🙂
Ответ №3:
вы могли бы создать исключение, но это кажется «грязным»
Комментарии:
1. Никогда, никогда не используйте исключения для логического потока. Когда-либо. Исключение может быть выдано, если произошло что-то исключительное. Но исключительно с целью завершения выполнения логики, никогда.
Ответ №4:
Вы могли бы рассмотреть возможность использования runtimeexception, но я не думаю, что это хороший дизайн.
Если моя рекурсия зашла так далеко, это означает, что это было необходимо … и я, вероятно, использую возврат