Я только начал изучать 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
Вы также должны 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);
}
Как это работает
- 10 > 1, go inside and 10-2 = 8
- 8 > 1 ,go inside and 8-2 = 6
- 6 > 1, go inside and 6-2 = 4
- 4 > 1, go inside and 4-2 = 2
- 2 > 1, go inside and 2-2 = 0
- 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