我目前正在尝试使用javascript中的简单for循环创建一个快乐的数字检查器。
function check(num){
var sNum = String(num);
var digits = [];
while (num !== 1){
for (var i = 0; i < String(num).length; i++){
digits.push(sNum.charAt(i));
digits[i] = Number(digits[i] * digits[i]);
}
num = eval(digits.join('+'))
return num;
}
alert(num);
}
check(1);
当num
在退出循环后收到其值时,如何将num
的新值重新注入for循环以使用新{{1}再次启动该过程}}。如果这可以通过当前for循环被其他循环包裹来解决,那么num value
的新值将如何重新进入?谢谢大家!
修改 这是更新的代码,其中只有数字1可用。
答案 0 :(得分:0)
如果满足条件,您可以递归地调用该函数。例如:
function check(num) {
// your code, and then...
if(/* whatever condition */) check(num);
}
要执行此操作,您可能需要从原始代码中删除return num
,或者如果您仍希望最终返回该号码,请将其放在功能的最后。
答案 1 :(得分:0)
检查一个快乐的数字要比这更难。您编写了一个循环,直到num
变为1
为止。好吧,对于不愉快的数字,num
永远不会变为1。
以下是一些更好的代码:
function check(num) {
var sNum,
digits = [];
var num;
while (num !== 1) {
// Add up all the digits
sNum = num.toString();
for (var i = 0; i < sNum.length; ++i) {
digits.push((+sNum[i]) * (+sNum[i]));
}
num = eval(digits.join("+"));
// If num is 4, then the number will NEVER be happy
if (num === 4) return false;
// We must reset digits
digits = [];
}
return true;
}
这有点像黑客。 4
并不是唯一不满意的数字,但所有不满意的数字最终都会通过序列4, 16, 37, 58, 89, 145, 42, 20
...(来源:维基百科),所以我检查4
(虽然20或16也可以做得很好)。
此外,使用eval
被视为不良做法。使用sum
功能代替:
function sum(digits) {
var s = 0;
for (var i = 0; i < digits.length; ++i) s += digits[i];
return s;
}
然后,您可以将eval(digits.join("+"))
替换为sum(digits)
。
答案 2 :(得分:0)
我认为这就是诀窍:
function isHappy(num) {
if(num === 1) return true;
if(num === 4) return false;
return isHappy((num + '').split('').reduce(function(prev, digit) {
return prev + digit*digit;
}, 0));
}
说明: