Цикл, условие 2, не соответствует - PullRequest
0 голосов
/ 12 сентября 2018

Я студент с ограниченными знаниями JavaScript (первый год) и нуждаюсь в помощи с Project Euler # 2.

var arr = [1, 2];
var total = 2;
var x = 0;
var y = 1;
for (var i; total < 4000000; x++, y++) {
  i = arr[x] + arr[y];
  arr.push(i);
  if (i % 2 == 0) {
    total += i
  }
}
console.log(total);

Предполагается, что мой цикл останавливается, когда общая сумма меньше 4 000 000, но по какой-то причине общая сумма составляет 4 613 732.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вот формулировка проблемы из Project Euler # 2 :

Каждый новый член в последовательности Фибоначчи генерируется путем добавления предыдущие два срока. Начиная с 1 и 2, первые 10 слагаемых будут быть:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Рассматривая слагаемые в последовательности Фибоначчи, значения которых не превысив четыре миллиона, найдите сумму четных членов.

Вы неверно истолковали "четыре миллиона" как верхнюю границу суммы , тогда как на самом деле это верхняя граница для отдельных чисел.

Следовательно, условие цикла должно быть i <= 4000000; но это еще не все - вам нужно изменить условия, потому что i установлен внутри цикла, поэтому условие не перехватит последнее добавленное число.

for (var i;; x++, y++) {
  i = arr[x] + arr[y];
  if (i > 4000000) break; // move condition to here
  arr.push(i);
  if (i % 2 == 0) {
    total += i
  }
}
0 голосов
/ 13 сентября 2018

Мне легче продумывать рекурсивные функции, когда они выражаются в функциональном стиле

const projectEuler2 = (limit = 0, sum = 0, a = 0, b = 1) =>
  a > limit
    ? sum
    : projectEuler2
        ( limit
        , a & 1 ? sum : sum + a
        , b
        , a + b
        ) 
    
console.log (projectEuler2 (4e6))
// 4613732
0 голосов
/ 12 сентября 2018

Ваш код «не» делает ничего необычного, for выполняется до тех пор, пока итоговое значение не превысит 4 000 000.

Например, если бы мне нужно было добавлять 20 каждый раз, когда мои циклы for к моему итоговому значению, и я проверяю каждыйвремя, если мой итог больше 50, он будет работать до тех пор, пока я не получу 60. не меньше 60 и никогда не будет 50, потому что я добавляю 20 для каждого.

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

Итак:

Мой цикл должен остановиться после того, как общее число равно 4 000 000, но по какой-то причине общее количество составляет 4 613 732.

кем вы являетесьдобавление, возможно, просто никогда не даст в общей сложности 4 000 000, а если это так, просто измените ваше состояние на total <= 4000000; вместо total < 4000000;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...