尽管满足 true 的条件,为什么方法返回 false?
Why is method returning false despite condition for true being met?
我很困惑为什么尽管“总计”为 1 但它仍返回 false。我知道如果不满足总计 = 1,程序将无限 运行,但即使满足,它 returns 错误。
该程序应该拆分一个数字的整数,将其平方并加在一起。它应该继续这样做,直到结果为 1。
示例:
23 = 2^2+3 ^2 = 13
13 = 1^2 + 3 ^2 = 10
10 = 1^2 + 0^2 = 1
class HappyNumber {
public static boolean find(int num) {
int total = 0;
while (num > 0) {
int first = num % 10;
System.out.println(first);
total += first * first;
System.out.println("total: " + total);
System.out.println("num: " + num);
num /= 10;
}
if (total == 1) {
System.out.println("outside the loop total is: " + total);
return true;
}
find(total);
return false;
public static void main(String[] args) {
System.out.println(HappyNumber.find(23));
}
}
Output:
3
total: 9
num: 23
2
total: 13
num: 2
3
total: 9
num: 13
1
total: 10
num: 1
0
total: 0
num: 10
1
total: 1
num: 1
outside the loop total is: 1
false
原因是该方法的第一次调用在if之外,所以第一次调用会return false。
要解决这个问题,您需要 return find(number) 而不是 false:
public static boolean find(int num) {
int total = 0;
while (num > 0) {
int first = num % 10;
System.out.println(first);
total += first * first;
System.out.println("total: " + total);
System.out.println("num: " + num);
num /= 10;
}
if (total == 1) {
System.out.println("outside the loop total is: " + total);
return true;
}
// find(total);
// return false;
return find(total);
}
在 main 的初始调用之后,该方法将执行其循环,然后递归调用 find(total),因为 total 不等于 1。循环将再次 运行,并且 total 将不等于1,所以再次递归调用find(total)。那是 两次 递归调用,因此您有两个帧被推入堆栈。在第二次递归调用时,total 的计算结果为 1,方法 returns 为真,一帧从堆栈中弹出。 但是,堆栈上还有另一个帧必须展开并且它确实返回 false。
我很困惑为什么尽管“总计”为 1 但它仍返回 false。我知道如果不满足总计 = 1,程序将无限 运行,但即使满足,它 returns 错误。 该程序应该拆分一个数字的整数,将其平方并加在一起。它应该继续这样做,直到结果为 1。
示例:
23 = 2^2+3 ^2 = 13
13 = 1^2 + 3 ^2 = 10
10 = 1^2 + 0^2 = 1
class HappyNumber {
public static boolean find(int num) {
int total = 0;
while (num > 0) {
int first = num % 10;
System.out.println(first);
total += first * first;
System.out.println("total: " + total);
System.out.println("num: " + num);
num /= 10;
}
if (total == 1) {
System.out.println("outside the loop total is: " + total);
return true;
}
find(total);
return false;
public static void main(String[] args) {
System.out.println(HappyNumber.find(23));
}
}
Output:
3
total: 9
num: 23
2
total: 13
num: 2
3
total: 9
num: 13
1
total: 10
num: 1
0
total: 0
num: 10
1
total: 1
num: 1
outside the loop total is: 1
false
原因是该方法的第一次调用在if之外,所以第一次调用会return false。
要解决这个问题,您需要 return find(number) 而不是 false:
public static boolean find(int num) {
int total = 0;
while (num > 0) {
int first = num % 10;
System.out.println(first);
total += first * first;
System.out.println("total: " + total);
System.out.println("num: " + num);
num /= 10;
}
if (total == 1) {
System.out.println("outside the loop total is: " + total);
return true;
}
// find(total);
// return false;
return find(total);
}
在 main 的初始调用之后,该方法将执行其循环,然后递归调用 find(total),因为 total 不等于 1。循环将再次 运行,并且 total 将不等于1,所以再次递归调用find(total)。那是 两次 递归调用,因此您有两个帧被推入堆栈。在第二次递归调用时,total 的计算结果为 1,方法 returns 为真,一帧从堆栈中弹出。 但是,堆栈上还有另一个帧必须展开并且它确实返回 false。