使用for循环结束时给定的值重新启动JavaScript for循环

Restarting a JavaScript for loop with the value given at the end of the for loop

本文关键字:for 循环 重新启动 JavaScript 结束 使用      更新时间:2023-09-26

我目前正试图在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循环中,以使用新的num value重新启动该进程。如果这可以用当前的for循环被它外面的另一个循环包装来解决,num的新值如何重新进入?谢谢大家!

编辑以下是更新后的代码,其中只有数字1有效

检查一个快乐的数字比这困难得多。你写一个循环,执行直到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;
}

这是一种hack。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)

我认为这是一个技巧:

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. 然后将其拆分为数字数组。
    3. 最后我们将这个数组reduce为平方和。

如果满足条件,可以递归地调用该函数。例如:

function check(num) {
    // your code, and then...
    if(/* whatever condition */) check(num);
}
要做到这一点,您可能需要从原始代码中删除return num,或者如果您仍然希望最终返回数字,则将其放在函数的最后。