我正在尝试创建一个 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/