尽管满足 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。