2015-05-11 3 views
-1

Я пытаюсь написать цикл for, который возвращает значения, которые каждый раз удваиваются (1,2,4,8,16 ...), но возвращает каждое значение дважды (2,2,4,4,8,8,16,16 ...) любая идея, чего я не хватает?.js for loop возвращает два из каждого значения

dub = function(howMany){ 
for(i = 1, y = 1, z = ''; z < howMany ; i = y, y = x, z ++){ 
    x = i * 2; 
    console.log(x); 
}};dub(20); 
+1

Непонятно, почему вы используете этот свернутый метод. Разве вы не можете просто «i = i * 2» внутри своей петли? –

+0

Почему вы используете так много разных переменных? И зачем их смешивать? Используйте одну переменную только для одной цели. – Bergi

ответ

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 ниже, вы должны объявить все переменные, используемые в цикле как локальный контекстными, иначе в может изменить переменную с тем же в другой области (как глобальная или закрытие сфера)

+0

Я не уверен, почему это было пропущено, потому что этот ответ работает, и это очень просто. Я не знаю, почему кто-то не хотел использовать метод «Math.pow». –

+0

Возможно, скажите ему использовать 'var' ??? – naomik

+0

@naomik yes ... вы правы –

-2

Если вы поместите это в верхней части вашего для петли, он будет пропускать второй итерации:

if (z%2==1) continue; 
+1

Код op не работает, потому что он передает старое значение x в y и старое значение y в i, поэтому цикл принимает две итерации до того, как i изменится на x * 2. Я понятия не имею, что ваш код исправляет. – softwarenewbie7331

+0

Я имел в виду 'z% 2', а не' i% 2'. Я редактировал. – Jakar

+0

все еще неправильно. это должно быть после назначения x и до того, как console.log достигнет назначенной функции OP. Не говоря уже о запутанном исправлении свернутого кода .. просто отпустите его – softwarenewbie7331

0

Вот функциональное решение для вас попробовать. Он использует ES6.

// mult :: Number a => a -> a -> a 
let mult = x => y => x * y; 

// double :: Number a => a -> a 
let double = mult(2); 

// repeat :: Number a => (a -> a) -> a -> a -> a; 
let repeat = f => n => x => n === 0 ? x : repeat(f)(n-1)(f(x)); 

// repeat the double function 20 times start with 1 
let result = repeat(double)(20)(1); 

// log the result 
console.log(result); // 1048576 

ES5 код здесь

// mult :: Number a => a -> a -> a 
var mult = function mult(x) { 
    return function (y) { 
    return x * y; 
    }; 
}; 

// double :: Number a => a -> a 
var double = mult(2); 

// repeat :: Number a => (a -> a) -> a -> a -> a; 
var repeat = function repeat(f) { 
    return function (n) { 
    return function (x) { 
     return n === 0 ? x : repeat(f)(n - 1)(f(x)); 
    }; 
    }; 
}; 

// repeat the double function 20 times start with 1 
var result = repeat(double)(20)(1); 

// log the result 
console.log(result); // 1048576 
0

Похоже вы усложненной для цикла:

function dub(howMany) { 
    for(var i = 1, y = 1;i<=howMany;i++, y+=y) { 
     console.log(y); 
    } 
} 

Я не ясно, на увеличения/уменьшения части цикла for или почему вы присвоили пустую строку z в i nitialization. Причина, по которой ваш цикл возвращал дубликаты, обнаруживается путем прохождения цикла с учетом переменных состояний.

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/

+0

На первой итерации 'z' на самом деле' 0'; 'var z = ''; г ++; // 0'. В противном случае, очень хорошая рецензия. – naomik

+0

Да, его интерпретируют как ноль, но если он передан в console.log (как в приведенном выше списке, он пуст (для ясности я набирал <пустую строку>). Спасибо! –

+0

Сет, нет, я имею в виду, что он использует 'for (i = 1, y = 1, z = '' ...'как init для цикла for. 'z' начинается как буквальная пустая строка ... Вы были правы в первый раз, просто' '' '' 0' для второй итерации, '1' для третьей и т. д. – naomik

-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; др: так как значение i обновляется в конечном экспрессии, чтобы быть y ПЕРЕД y обновляется, чтобы быть x (результат выражений в цикле) , 2 итерации цикла должны пройти до того, как i будет равна новому значению x.

Полное прохождение игры (надеюсь без ошибок, я не устал)

  1. Во время первого выполнения этого цикла, ни один из конечных выражений (после второго ;) не оцениваются. i равно 1, поэтому x присваивается значение 2 (1 * 2).
  2. Окончательные выражения оцениваются. i присвоено значение y, которое равно 1 (то же значение, что и у i было на первом цикле). y присваивается значение x, которое составляет 2.
  3. Содержимое цикла for вычисляется снова. Так как i был назначен 1 снова, то результат будет тот же, и 2 регистрируется снова (и x снова равна 2.
  4. Окончательные-выражения вычисляются. i присваивается значение y (ныне 2 со стадии 2) и y присваивается значение x (еще 2 с шага 2).
  5. цикл выполняется снова ... i теперь содержит значение 2 так x присваивается значение 4 и 4 регистрируется на консоли.
  6. окончательные выражения: i присваивается значение y (по-прежнему 2), тогда y присваивается значение x (сейчас 4).
  7. Этот рисунок продолжается ...
+0

Есть ли что-то не так с этим объяснением? Если я сделаю простую логическую ошибку, пытаясь разобраться в ней, я исправлю ее =). Или это просто ответ, подобный этому, серьезно ограничил применимость для более широкой аудитории? – Andrew