Агрегация данных

Отдельный класс задач, который не может обойтись без циклов, называется агрегированием данных. К таким задачам относятся поиск максимального, минимального, суммы, среднего арифметического и т.п. Их главное отличие от остальных вычислений, в зависимости от всего набора данных. Для рассчета суммы нужно сложить все числа, для вычисления максимального нужно сравнить все числа.

С такими задачами хорошо знакомы все кто занимаются числами, например, бухгалтера или маркетологи. Обычно их выполняют в таблицах наподобие Microsoft Excel или Google Tables.

Разберем самый простой пример – поиск суммы. Реализуем функцию, которая складывает числа в указанном диапазоне включая границы.

sum(5, 7); // 5 + 6 + 7

Для реализации этого кода нам понадобится цикл, так как сложение чисел это итеративный процесс (он повторяется для каждого числа), а количество итераций зависит от размера диапазона. Перед тем как смотреть код, попробуйте ответьте на вопросы ниже:

  • Каким значением инициализировать счетчик?
  • Как он будет изменяться?
  • Когда цикл должен остановиться?

Теперь посмотрим код:

const sum = (start, end) => {
  // Технически можно менять start
  // Но входные аргументы нужно оставлять в исходном значении
  // Это сделает код проще для анализа
  let i = start;
  let result = 0; // Инициализация суммы

  while (i <= end) {
    result = result + i;
    i = i + 1;
  }

  // Возвращаем получившийся результат
  return result;
};

Общая структура цикла здесь стандартна. Есть счетчик, который инициализируется начальным значением диапазона, есть сам цикл с условием остановки при достижении конца диапазона, и, наконец, изменение счетчика в конце тела цикла. Количество итераций в таком цикле равно end - start + 1. То есть для диапазона от 5 до 7 это три итерации по числам 5, 6 и 7.

Главные отличия связаны с логикой вычислений результата. В задачах на агрегацию всегда есть какая-то переменная, которая хранит внутри себя результат работы цикла. В нашем случае это result. У этой переменной есть начальное значение, соответствующее нейтральному элементу операции. Это математическое понятие имеет очень простой смысл. Представьте что мы вызываем функцию так sum(5, 4). Какое значение должна вернуть функция? Правильный ответ: 0. Это и есть нейтральный элемент сложения. Любое число плюс ноль дает само число. В агрегации любое действие всегда начинается с нейтрального элемента: 0 + 5 + 6 + 7.

Вопрос на самопроверку. Какой нейтральный элемент у операции умножения?

Задание

Реализуйте функцию multi которая перемножает числа в указанном диапазоне вклюая границы диапазона. Пример вызова:

multi(5, 5); // 5
multi(1, 3); // 6

Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics
Упражнение доступно только авторизованным пользователям.

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