我正在尝试编写一个for循环,它返回每次加倍的值(1,2,4,8,16 ...)此代码可以工作但返回每个值两次(2,2,4,4,8) ,8,16,16 ......)知道我缺少什么吗?
dub = function(howMany){
for(i = 1, y = 1, z = ''; z < howMany ; i = y, y = x, z ++ ){
x = i * 2;
console.log(x);
}};dub(20);
答案 0 :(得分:0)
我认为您可以使用Math.pow()功能
dub = function (howMany) {
for (var i = 0; i < howMany; i++) {
console.log(Math.pow(2, i))
}
};
dub(20);
演示:Fiddle
如果你不想使用Math.pow(),你可以使用2个变量,1作为计数器,另一个作为乘数,如
dub = function (howMany) {
for (var i = 0, x = 1; i < howMany; i++, x *= 2) {
console.log(x);
}
};
dub(20);
演示:Fiddle
另外请注意下面的@naomik所建议的,你需要将循环中使用的所有变量声明为局部作用域,否则可以在另一个作用域中修改相同的变量(如全局或闭包范围)
答案 1 :(得分:0)
好像你的for循环过于复杂:
function dub(howMany) {
for(var i = 1, y = 1;i<=howMany;i++, y+=y) {
console.log(y);
}
}
我不清楚for循环的递增/递减部分或者在初始化中为z
分配空字符串的原因。你的循环返回重复项的原因可以通过循环遍历变量状态来找到。
Iteration 01 - i:1 x:0 y:1 z: <empty string>
Iteration 02 - i:1 x:2 y:2 z: 1
Iteration 03 - i:2 x:2 y:2 z: 2
Iteration 04 - i:2 x:4 y:4 z: 3
Iteration 05 - i:4 x:4 y:4 z: 4
Iteration 06 - i:4 x:8 y:8 z: 5
Iteration 07 - i:8 x:8 y:8 z: 6
Iteration 08 - i:8 x:16 y:16 z: 7
Iteration 09 - i:16 x:16 y:16 z: 8
Iteration 10 - i:16 x:32 y:32 z: 9
请注意,将y
反向i
然后x
再分配给y
等的方式是不必要的。希望我已经回答了你的问题,因为你可能还有其他要求没有共享,需要将这些值链接起来,而不仅仅是如上所述创建一个双循环。
这是一个有效的JSFiddle:https://jsfiddle.net/f39jd848/
答案 2 :(得分:-1)
别介意所有这些答案显示如何更简单地编写代码。要回答你的问题,这里的操作顺序为你提供了两个相同的控制台日志。
供参考:
dub = function(howMany){
for(i = 1, y = 1, z = ''; z < howMany ; i = y, y = x, z ++ ){
x = i * 2;
console.log(x);
}};dub(20);
tl; dr:因为i
的值在最终表达式中更新为y
之前y
已更新为x
(结果为循环中的表达式)。循环的2次迭代必须在i
等于x
的新值之前通过。
完整的演练(希望没有错误,我累了)
;
之后)。
i
等于1,因此为x
分配值2
(1 * 2)。i
被赋予y
的值1
(i
与第一个循环相同的值)。我为y
分配了值x
,即2
。i
已再次分配1
,结果相同,并再次记录2
(x
再次等于2
。i
的值已分配y
(现在2
来自第2步),y
的值已分配x
(仍为2
从步骤2)。i
现在包含值2
,因此为x
分配值4
,并将4
记录到控制台。i
的值为y
(仍为2
),然后y
的值为x
(现在{ {1}})。答案 3 :(得分:-2)
如果你将它放在for循环的顶部,它将跳过第二次迭代:
if (z%2==1) continue;