Возврат java делает странные вещи

Я только начал изучать Java для университета с некоторыми упражнениями. Я не новичок в программировании, только в Java. Я выполнил все инструкции, но функция возврата Java делает некоторые действительно странные вещи. Я вставил несколько выходных данных отладки, чтобы лучше понять код. CMD. Вывод программы включен.

Я думал, что функция завершится сразу после возврата. Но почему в данном случае этого не происходит?

public class Rekursion {

    public static void main(String[] args) {
        int zahl = 10;
        System.out.println("debugStart");
        boolean even = isEven(zahl);
        System.out.println("debugEnd");

        if (even == true) {
            System.out.println(zahl + " is even");
        } else {
            System.out.println(zahl + " is uneven");
        }
    }

    public static boolean isEven(int n) {
        System.out.println(n);
        if (n > 1) {
            System.out.println("debugx");
            isEven(n - 2);
        }

        if (n == 0) {
            System.out.println("debug1");
            return true;
        } else if (n == 1) {
            System.out.println("debug2");
            return false;
        } else {
            System.out.println("ERROR");
            return false;
        }
    }
}

Выход (cmd):

debugStart
10
debugx
8
debugx
6
debugx
4
debugx
2
debugx
0
debug1

Программе нужно останавливаться на этом, как правило. Но это продолжается ....

ERROR
ERROR
ERROR
ERROR
ERROR
debugEnd
10 is uneven
4
0
192
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы также должны return вызов рекурсии,

 if(n>1){
     System.out.println("debugx");
     return isEven(n-2);//return at this point
 }

Поскольку вы не вернулись, ваши рекурсивные вызовы достигают операторов else, следовательно, возвращают false.

Это потому, что у вас есть рекурсия внутри метода

 if(n>1){
        System.out.println("debugx");
        isEven(n-2);
 }

Как это работает

  1. 10 > 1, go inside and 10-2 = 8
  2. 8 > 1 ,go inside and 8-2 = 6
  3. 6 > 1, go inside and 6-2 = 4
  4. 4 > 1, go inside and 4-2 = 2
  5. 2 > 1, go inside and 2-2 = 0
  6. 2 > 1, no , then n===0,yes -> System.out.println("debug1");

Вам нужно добавить return в isEven(n-2)

Исправленный код:

public class Rekursion{

public static void main(String[] args){
    int zahl = 10;
    System.out.println("debugStart");
    boolean even = isEven(zahl);
    System.out.println("debugEnd");

    if(even == true){
        System.out.println(zahl+" is even");
    }

    else{
        System.out.println(zahl+" is uneven");
    }
}

public static boolean isEven(int n){
    System.out.println(n);
    if(n>1){
        System.out.println("debugx");
        return isEven(n-2);
    }

    if (n == 0) {
        System.out.println("debug1");
        return true;
    }

    else if (n == 1) {
        System.out.println("debug2");
        return false;
    }

    else{
        System.out.println("ERROR");
        return false;
    }
}

}

Добавлен оператор return.

Я почти уверен, что вы просто забыли добавить оператор return перед isEven(n-2).

Итак, исправленный код метода isEven () будет таким:

public static boolean isEven(int n){
    System.out.println(n);
    if(n>1){
        System.out.println("debugx");
        return isEven(n-2);
    }

    if (n == 0) {
        System.out.println("debug1");
        return true;
    }

    else if (n == 1) {
        System.out.println("debug2");
        return false;
    }

    else{
        System.out.println("ERROR");
        return false;
    }
}

Теперь результат должен выглядеть так:

debugStart
10
debugx
8
debugx
6
debugx
4
debugx
2
debugx
0
debug1
debugEnd
10 is even

Другие вопросы по теме