使用for循环结束时给定的值重新启动JavaScript for循环
Restarting a JavaScript for loop with the value given at the end of the for loop
我目前正试图在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
,作为检测快乐数字的基准。 现在,我们必须有一个基本情况来检测悲伤的数字。
根据维基百科,悲伤的数字以循环
4, 16, 37, 58, 89, 145, 42, 20, 4, ...
结束。例如,我们可以检查4
。你也可以全部查看:
~[4, 16, 37, 58, 89, 145, 42, 20].indexOf(num)
.现在我们做一个递归调用来检查数字的平方和是否满意。
要计算总和,我们使用:
- 首先将
num
转换为字符串:num + ''
- 然后将其拆分为数字数组。
- 最后我们将这个数组
reduce
为平方和。
- 首先将
如果满足条件,可以递归地调用该函数。例如:
function check(num) {
// your code, and then...
if(/* whatever condition */) check(num);
}
要做到这一点,您可能需要从原始代码中删除return num
,或者如果您仍然希望最终返回数字,则将其放在函数的最后。 相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记