Сумма нечетных чисел до достижения предела в Javascript - PullRequest
0 голосов
/ 17 мая 2018

Пока я решал вопрос «добавить нечетные числа от 1 до 20», я закодировал это:

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}
document.write(sum);

Когда я запустил его через браузер, он не работал. Однако, когда я установил i*2 в i+=2, это сработало.

Чего мне не хватает? Я не могу использовать * (множитель) в циклах?

Ответы [ 5 ]

0 голосов
/ 17 мая 2018

Если вам нужно добавить нечетные числа от 1 до 20, то вам нужно i+=2 в качестве третьего параметра для for и нужно инициализировать переменную в 1, чтобы получить правильный результат:

var sum = 0;
for (var i = 1; i <= 20; i += 2) {
    sum += i;
}

Когда у вас есть

i + = 2

2 добавляется к i, а результат сохраняется в i.При попытке

var i, sum=0;
for (i=2; i<=20; i*2){
  sum=sum+i;
}

i*2 вычисляет значение, которое в два раза больше i, но оно не изменит значение i, поэтому вместо этого это «сработает»:

var i, sum=0;
for (i=2; i<=20; i*=2){
  sum=sum+i;
}

, где

i *= 2

не только вычисляет значение в два раза больше i, но также сохраняет результат в i.Однако даже если это будет выполнено, результат не будет корректным, поскольку вы используете неправильную формулу.

Кроме того, вы можете вычислить результат без использования for:

1 + 2 + ... + n = n * (n + 1) / 2

Предполагая, что n является парой: и так как мы знаем, что мы «пропускаем» половину чисел ивсе номера пар больше точно на 1, чем предыдущие числа с ошибками, мы можем вычесть половину последовательности

n * (n + 1) / 2 - n / 2 = (n * (n+ 1) - n) / 2 = (n * (n + 1 - 1)) / 2 = n * n / 2

, и теперь мы имеем ровно двойное значение того, что нам нужно,итоговая формула выглядит так:

sum = n * n / 4;

Давайте сделаем это function

function getOddSumUpTo(limit) {
    if (limit % 2) limit ++;
    return limit * limit / 4;
}

, а затем:

var sum = getOddSumUpTo(20);

Обратите внимание, что мы увеличиваем предел, если онстранный.

0 голосов
/ 17 мая 2018

То, что вы ищете, это:

let sum = 0;
for(var i = 2; i <= 20; i += 2){
  sum += i;
}
document.write(sum)

Еще один взгляд на это:

// set to n (what you want). Set to n + 1
var N = 21;

// The main driver code create an array from 0-(N-1) and removes all even nums

let a = Array.apply(null, {length: N}).map(Number.call, _ => +_).filter(_=>_%2)

// console.log the array
console.log(a)
0 голосов
/ 17 мая 2018

Вы можете просто сделать это аналогично тому, что вы написали о сумме.

Вы использовали там i += 2, а не i + 2.

Точно так же просто измените i * 2 на i *= 2.

Вот рабочий пример

var i, sum = 0;
for (i = 2; i <= 20; i *= 2) {
  console.log(i);
  sum += i;
}
document.write(sum);

Но пара вещей здесь.

Прежде всего Вы написали

добавить нечетные числа от 1 до 20

и во всех ваших примерах вы используете сумму на четных числах.

Во-вторых , умножая, вы не достигнете желаемой цели (как вы можете видеть в приведенном выше фрагменте на консоли)

Так на самом деле

добавить нечетные числа от 1 до 20

вы должны сделать это так:

var i, sum = 0;
for (i = 1; i <= 20; i += 2) {
  console.log(i);
  sum += i;
}
document.write(sum);

EDIT

Если вы хотите добавить четные числа, вы все равно не можете использовать умножение.

Почему? Просто потому, что вы сами сказали, что хотите сумму чисел.

Итак, допустим, мы начинаем с 2.
Если мы умножим его на 2, то получим значение 4, что нормально.
Но теперь посмотрим, что произойдет в следующей итерации. Наша переменная i, которая имеет значение 4, умножается на 2, и теперь ее новое значение равно 8. Так что насчет 6?
На следующей итерации умножьте 8 на 2 и получите новое значение 16.

Вы видите, куда это идет?

А когда вы используете i += 2 вместо i *= 2?

Так что, если мы начнем с 2 и затем добавим 2, его новое значение будет равно 4.
В следующей итерации мы добавляем 2 к 4 и получаем 6.
И так далее.

Если вы хотите проверить это, вот пример с умножением и добавлением .

Обратите внимание на логи консоли

var i;

console.log("Multiplying");
for (i = 2; i <= 20; i *= 2) {
  console.log("i value is: " + i);
}

console.log("Adding");
for (i = 2; i <= 20; i += 2) {
  console.log("i value is: " + i);
}
0 голосов
/ 17 мая 2018

Вы можете использовать любое выражение в заголовке цикла, даже это допустимо для оператора цикла for (;;), который просто выполняется вечно (эквивалентно while(true)).

Проблема в том, что вы не обновляете *Счетчик 1005 * в for (i=2; i<=20; i*2), поэтому i будет оставаться неизменным на протяжении всего цикла.Если вы измените его на (i=2; i<=20; i = i*2) или for (i=2; i<=20; i *=2), то оно будет работать.

Это то же самое, что если бы вы сделали

let i = 1;

i * 2;
console.log(i);

i = i * 2;
console.log(i);

Первый i * 2 не обновляет i, а второй обновляет.

Вы также можете перевести цикл for в цикл whileчтобы увидеть ошибку более четко.

// wrong
let i = 1;
while(i <= 20) {
  i * 2;
  // do something
}

// right
let i = 1;
while(i <= 20) {
  i = i * 2 // or i *= 2
  // do something
}

Просто примечание, если вы хотите эффективно выполнить суммирование для большего количества типов последовательностей, чем вы могли бы использовать подход на основе генератора, написать свою функцию суммы и описать каждый типпоследовательности с функцией генератора.

function *generateOdd(start, end) {
  for (let i = start; i <= end; i++) {
    if (i % 2 === 1) { yield i; }
  }
}

function *generateEven(start, end) {
  for (let i = start; i <= end; i++) {
    if (i % 2 === 0) { yield i; }
  }
}

function sumNums(gen, start, end) {
  const generator = gen(start, end);
  let res = 0;

  let item = generator.next();
  while (!item.done) {
    res += item.value;
    item = generator.next();
  }

  return res;
}

console.log(sumNums(generateOdd, 0, 20));
console.log(sumNums(generateEven, 0, 20));
0 голосов
/ 17 мая 2018

Проблема в том, что вы не обновляете значение i в for loop.

Я хочу добавить нечетные числа от 1 до 20

Затем вам нужно изменить начальное значение i на 1.

var i, sum = 0;
for (i = 1; i <= 20; i += 2){
  sum += i;
}
document.write(sum);

Кроме того, вы можете найти сумму odd numbers from 1 to 20 по формуле.

n = 20;
console.log(n % 2 == 0 ? (n * n)/ 4 : ((n + 1) * (n + 1))/4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...