@Iliyaity

Как работает данный пример?

Задача: нужно написать функцию, которая выводит кол-во четных чисел в диапазоне от x до y. Например (6,11) Ответа: 3 т.к. 6, 8 и 10.

Мое решение:
function divisibleCount(x,y,k){
  
  var answer = 0;
  
  for(var i = x; i <= y; i+=2){
    
     answer++;
  }
  
  return answer;
  
}


Мое решение не прошло по причине низкой производительности (на больших цифрах очень долгие вычисления );

Вот код с очень высокой производительностью.

function divisibleCount(x, y, k) {
  var first = Math.ceil(x / k) * k;
  if (first > y) return 0;
  return parseInt((y - first) / k) + 1;
}


Вопросы:

1)Почему мой код такой медленный? Насколько я знаю, циклы должны работать быстро, а такое чувство, как будто вычисления производятся через рекурсию
2)Объясните пожалуйста решение, указанное выше. Математической формулы для вычисления я не нашел,а может и нашел, но не понял т.к. с математикой у меня проблемы(я пытаюсь это исправить).
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MNB
количество четных чисел в диапазоне всегда равно половине разницы между последним и первым числом + 1
примерно это и делает быстрая функция + пара хитрых проверок.
циклы тут вовсе не нужны.

Школа, да?
Ответ написан
У вас цикл, а во втором примере одна единственная формула, очевидно, что второй пример быстрее выполнится, так как циклу придётся ещё числа в диапазоне указанном обойти, а тут формула -- взял и решил за считанные мс. А циклы быстро работают, если сравнивать с рекурсией, но не всегда (наравне бывают).
Назначение загадочной k, кстати, неясно из примера(возможно, мне одному...)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы