Eloquent JavaScript сумма диапазона функции книги упражнений [фиксированная] - PullRequest
1 голос
/ 01 августа 2020

Сумма диапазона

Напишите функцию диапазона, которая принимает два аргумента, начало и конец, и возвращает массив, содержащий все числа от начала до конца (включительно) .

Измените функцию диапазона, чтобы она принимала необязательный третий аргумент, который указывает значение «шага», используемое при построении массива. Если шаг не задан, элементы go увеличиваются на единицу, что соответствует старому поведению. Диапазон вызова функции (1, 10, 2) должен возвращать [1, 3, 5, 7, 9]. Убедитесь, что он также работает с отрицательными значениями шага , чтобы диапазон (5, 2, -1) давал [5, 4, 3, 2].

Книжное решение:

function range(start, end, step) {
      if (step == null) step = 1;
      var array = [];
    
      if (step > 0) {
        for (var i = start; i <= end; i += step)
          array.push(i);
      } else {
        for (var i = start; i >= end; i += step)
          array.push(i);
      }
      return array;
    }

console.log (range(1,10,2))
// → [1, 3, 5, 7, 9]
console.log(range(5, 2, -1));
// → [5, 4, 3, 2]

Но это решение не работает ни с одним начальным и конечным значением.

Пример:

console.log (range(1,10,-1))
// → []

Призывают ли кого-нибудь изменить код и объяснить Шаги подробно, чтобы он работал с любыми положительными или отрицательными значениями начала, конца и шага? ТКС

Ответы [ 4 ]

2 голосов
/ 01 августа 2020

Эта функция предполагает - начало должно быть больше конца, если шаг отрицательный. Итак, ваш ввод является своего рода Недействительным вводом.

На самом деле, говоря, что это Недействительный ввод, было бы неправильно, его основная c математика, когда вы начинаете с 1 и начинаете уменьшать на -1, вы никогда не пойдете для достижения - 10.

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

т.е. добавив эти строки вверху.

if(start < end && step < 0) {
   [start, end] = [end, start]
}

Но тогда было бы неправильно говорить, что они начинаются и заканчиваются.

2 голосов
/ 01 августа 2020

Попробуйте следующее:

if(start < end && step < 0) {
   [start, end] = [end, start]
}

Добавьте этот фрагмент в свою функцию, когда start меньше end, а step отрицательный, затем инвертируйте значения start и end.

function range(start, end, step) {
      if(start < end && step < 0) {
       [start, end] = [end, start]
      }
      if (step == null) step = 1;
      var array = [];
    
      if (step > 0) {
        for (var i = start; i <= end; i += step)
          array.push(i);
      } else {
        for (var i = start; i >= end; i += step)
          array.push(i);
      }
      return array;
    }

console.log (range(1, 10, 2));
// → [1, 3, 5, 7, 9]
console.log(range(5, 2, -1));
// → [5, 4, 3, 2]
console.log (range(1, 10, -1));
// → [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
1 голос
/ 01 августа 2020

Когда вы вызываете функцию, какие эти параметры, происходит вот что:

  1. Шаг - отрицательное значение, поэтому он использует второе для l oop (внутри блока else)
  2. Затем это для l oop выполняется, пока i больше или равно конечному значению

Однако, поскольку i устанавливается равным 1 в качестве начального значения, а конечное значение установлено равным 10, l oop никогда не запустится, поскольку i меньше конечного значения. Это означает, что i >= end будет оцениваться как false с самого начала, а l oop никогда не запустится.

0 голосов
/ 01 августа 2020

Измените ваш пример на:

console.log(range(10, 1, -1));

, потому что start должно быть больше end, когда step отрицательно.

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