Есть ли способ завершить рекурсивный метод при выполнении определенного условия в Java?

#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, но я не думаю, что это хороший дизайн.

Если моя рекурсия зашла так далеко, это означает, что это было необходимо … и я, вероятно, использую возврат