使用for循环结尾处给出的值重新启动JavaScript for循环

时间:2014-07-06 14:59:29

标签: javascript for-loop code-injection

我目前正在尝试使用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可用。

3 个答案:

答案 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));
}

说明:

  1. 首先,我们检查号码是否为1,作为检测满意数字的基本情况。
  2. 现在,我们必须有一个基本案例来检测悲伤的数字。

    根据维基百科,悲伤的数字在周期4, 16, 37, 58, 89, 145, 42, 20, 4, ...结束。因此,我们可以检查4

    你也可以全部检查:~[4, 16, 37, 58, 89, 145, 42, 20].indexOf(num)

  3. 现在我们做一个递归调用来检查数字的平方和是否满意。

    要计算这笔金额,我们使用:

    1. 首先将num转换为字符串:num + ''
    2. 然后split为数字数组。
    3. 最后我们将reduce数组加到正方形之和。