java - Java中的isHappy函数

标签 java recursion numbers

我正在尝试创建一个 isHappy 方法,如果给定的整数是一个快乐的数字,则该方法将返回 True,否则返回 false。

如果一个数字可以通过重复计算其数字的平方和而达到数字 1,那么这个数字就是幸福的。例如397是一个快乐的数字:

397 -> 139 -> 91 -> 82 -> 100 -> 1

不高兴的数字会循环,因此永远不会达到 1。 123 不是一个快乐的数字:

123 -> 14 -> 17 -> 50 -> 25 -> 29 -> 85 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16 -> 37 -> 58 -> 89 -> ...

为了确定一个数字是否满意,我尝试使用递归算法,该算法需要维护三个额外的项目。 1) 一个已经见过的数字,将记住固定的步数,2) 我们将记住这个数字的剩余步数,以及 3) 一旦我们忘记了这个数字,我们会记住这个数字多长时间我们看到的下一个数字(比记住的最后一个数字长一步)。

当我们记住的数字与序列中的下一个数字相同时, 我们知道我们已经到达一个循环,然后可以停止。

这是我的代码:

public static boolean isHappy(int n) {
     assert n > 0 : "n should be positive";
     // Post: Returns true if a number is 'happy', unless false.
     return checkHappiness (n, n/2, n/8, n/16);  
  }

private static boolean checkHappiness (int n, int r, int t, int nt) {
    // A (hidden) helper function of 'isHappy' that counts additional parameters.
    if (n == 1) return true;
     else if (n == r) return false;
      else if (t > 0) return checkHappiness (sumSquareDigits (n),r,t-1,nt);
       else if (t == 0) return checkHappiness (n+1, n, nt, nt+1);
    return true;
  }

我应该提到辅助函数的参数是:当前数字 (n)、当前被记住的数字 (r)、该数字将被记住多长时间 (t) 以及下一个数字的时间量记住的数字将被记住 (nt)。

除了 2 的情况外,它工作得很好。出于某种原因,它认为 2 是一个快乐的数字,但事实并非如此!谁能看到我的错误在哪里?谢谢!

最佳答案

从它的外观来看,(我无法运行它来检查)问题似乎出在这里:

else if (n == r) return false;

数字 2 重复以下模式:

2, 4, 16, 37, 58, 89, 145, 42, 20, 4, 16, ...

但是,它永远不会等于原始数字 2。因此 if 会失败

关于java - Java中的isHappy函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029983/

相关文章:

java - JUnit 延迟断言消息创建

c++ - 如何启用递归函数以避免堆栈溢出?

python - 如何使用递归验证函数验证表单

Java:比较 3 个数字。获得其中最伟大的

javascript - 我的猜测次数不会停止在正确的水平

java - 错误: asking to create a new class while accessing innerclass

java - "duck an exception"是什么意思?

java - Java 的 'single sign-on'(使用来自 'Credential Manager' 的凭据)可以在 Windows 上被禁用吗?

java - 使用递归和回溯找到所有可能的多米诺骨牌链

python 吸血鬼号