尝试创建一段代码,以返回小于1000的所有数字(是三的倍数)。这是相关的代码。
<script>
var i = 1;
var mplesOf3 = [0];
var myNum = 0;
while (myNum < 1000){
(3 * i) = myNum;
mplesOf3.push(myNum);
i++;
};
alert(mplesOf3);
</script>
代码在html页面中运行,因此提供了样式标签和警报。
代码基本上尝试执行3x1然后3x2然后3x3等等,直到结果超过1000。几天前我提出了这个概念,但我仍然不确定为什么它不能正常运行。
从记录来看,我已经看到了其他解决方案,但是由于我正在学习并且想改进,所以我想知道为什么该解决方案不起作用。
提前谢谢
编辑:我应该知道这个错误是愚蠢的。我在伪代码上写了(3 x 1)= n,只是没有发现错误,因为对我来说似乎没有错。感谢所有各方,我会在可能的情况下接受答复。
答案 0 :(得分:1)
这是无效的:
(3 * i) = myNum;
相反,请执行以下操作:
myNum = (3 * i);
我会这样做,并且要注意,即使最后一个也保持在1000以下:
<script>
var i, mplesOf3;
mplesOf3 = [];
for (i=0; i<1000; i++){
if (i % 3 === 0){
mplesOf3.push(i);
}
}
alert(mplesOf3);
</script>
更新(请参阅评论):
为了提高效率,您的代码也更好,这里是一个完整的修复程序,甚至可以将最后一个值控制在1000以下:
var i = 1;
var mplesOf3 = [0];
var myNum = 0;
while (myNum < 1000){
myNum = 3 * i;
myNum < 1000 && mplesOf3.push(myNum);
i++;
};
alert(mplesOf3);
另一个改进是避免在每个循环中进行比较,并始终从最终数组中删除最后一项:
var i = 1;
var mplesOf3 = [0];
var myNum = 0;
while (myNum < 1000){
myNum = 3 * i;
mplesOf3.push(myNum);
i++;
};
mplesOf3.pop();
alert(mplesOf3);
答案 1 :(得分:1)
您的JavaScript引擎应该告诉您语法错误(如果使用浏览器,请在Web控制台中查看)。作业的左侧一侧不能有(3 * i)
这样的表达式。在JavaScript中,对=
右边的事物进行评估,并将其分配给左边的事物。
您的算法还会导致推送1002,因为直到 之后,您才测试设置myNum = 3 * i
的结果。
使用原始算法,但修复了以下两点:
var i = 1;
var mplesOf3 = [0];
var myNum;
while ((myNum = 3 * i) < 1000){
mplesOf3.push(myNum);
i++;
} // Note: No semicolon here, you don't put semicolons after blocks
// attached to control-flow statements
console.log(mplesOf3);
此位:
while ((myNum = 3 * i) < 1000){
计算3 * i
,将结果分配给myNum
,然后检查该值是否为<
1000。
也就是说,在增量部分使用for
和myNum += 3
可能会更简单(变量更少,乘法更少):
var mplesOf3 = [0];
var myNum;
for (var myNum = 3; myNum < 1000; myNum += 3) {
mplesOf3.push(myNum);
}
console.log(mplesOf3);
也没有特别好的理由对0
进行这样的特殊处理,因此我很可能一开始就将其排除在数组之外并从0
开始计数:
var mplesOf3 = [];
var myNum;
for (var myNum = 0; myNum < 1000; myNum += 3) {
mplesOf3.push(myNum);
}
console.log(mplesOf3);
答案 2 :(得分:0)
也许您的错误是(3 * i) = myNum;
您只需要:myNum=(3 * i);
然后为名字分配一个值;