我试图使方法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),以及下一个记忆的数字将花费的时间被记住(新台币)。
除了2的情况外,这都可以正常工作。出于某种原因,它认为2是一个快乐的数字,但不是!谁能看到我的错误在哪里?谢谢!
最佳答案
从它的外观((我无法运行它来检查))看来,问题出在这里:
else if (n == r) return false;
数字2重复以下模式:
2, 4, 16, 37, 58, 89, 145, 42, 20, 4, 16, ...
但是,它永远不会等于原始数字2。因此,如果失败