HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Еще один распространенный вариант использования циклов на массивах -<strong>агрегация</strong>, которую мы рассмотрим в этом уроке.</p>
1 <p>Еще один распространенный вариант использования циклов на массивах -<strong>агрегация</strong>, которую мы рассмотрим в этом уроке.</p>
2 <h2>Как работает агрегация</h2>
2 <h2>Как работает агрегация</h2>
3 <p>Агрегацией считаются любые вычисления, которые строятся на основе всего набора данных - например, поиск максимального или среднего числа, подсчет суммы и так далее. Агрегирующие функции особенно популярны в работе с цифрами и таблицами в Google Sheets и Microsoft Excel.</p>
3 <p>Агрегацией считаются любые вычисления, которые строятся на основе всего набора данных - например, поиск максимального или среднего числа, подсчет суммы и так далее. Агрегирующие функции особенно популярны в работе с цифрами и таблицами в Google Sheets и Microsoft Excel.</p>
4 <p>Для начала рассмотрим такой код:</p>
4 <p>Для начала рассмотрим такой код:</p>
5 <p>Алгоритм поиска максимального числа в массиве выглядит так:</p>
5 <p>Алгоритм поиска максимального числа в массиве выглядит так:</p>
6 <ol><li>Если массив пустой, то возвращаем null. Это классический пример использования идиомы<a>guard expression</a><em>(охраняющее выражение)</em>. Ее идея в том, что в начале функции проверяются самые простые условия, для которых нужен минимум вычислений. При таком подходе основной код находится на верхнем уровне, а не внутри условной конструкции. Такой код легче читать, потому что у него меньше вложенность.</li>
6 <ol><li>Если массив пустой, то возвращаем null. Это классический пример использования идиомы<a>guard expression</a><em>(охраняющее выражение)</em>. Ее идея в том, что в начале функции проверяются самые простые условия, для которых нужен минимум вычислений. При таком подходе основной код находится на верхнем уровне, а не внутри условной конструкции. Такой код легче читать, потому что у него меньше вложенность.</li>
7 <li>Если массив не пустой, берем за точку отсчета первый элемент массива и считаем его максимальным.</li>
7 <li>Если массив не пустой, берем за точку отсчета первый элемент массива и считаем его максимальным.</li>
8 <li>Обходим массив, начиная со второго элемента и сравниваем каждое значение с максимальным. Если текущий рассматриваемый элемент больше максимального, то он становится максимальным.</li>
8 <li>Обходим массив, начиная со второго элемента и сравниваем каждое значение с максимальным. Если текущий рассматриваемый элемент больше максимального, то он становится максимальным.</li>
9 <li>После обхода возвращаем результат.</li>
9 <li>После обхода возвращаем результат.</li>
10 </ol><p>Главное, что нужно увидеть в этом коде - место определения переменной $max. Новички часто забывают, что переменную нужно определить до ее использования. Объявленные внутри цикла переменные не должны использоваться за пределами цикла, поэтому переменная и определяется до его начала.</p>
10 </ol><p>Главное, что нужно увидеть в этом коде - место определения переменной $max. Новички часто забывают, что переменную нужно определить до ее использования. Объявленные внутри цикла переменные не должны использоваться за пределами цикла, поэтому переменная и определяется до его начала.</p>
11 <p>В большинстве языков переменные, определенные внутри блока кода, видны только внутри этого блока. Именно так работает тело цикла в нашем случае. Другими словами, область видимости таких переменных ограничивается блоком кода, то есть мы не можем получить доступ к ним вне блока.</p>
11 <p>В большинстве языков переменные, определенные внутри блока кода, видны только внутри этого блока. Именно так работает тело цикла в нашем случае. Другими словами, область видимости таких переменных ограничивается блоком кода, то есть мы не можем получить доступ к ним вне блока.</p>
12 <p>Обратите внимание, что начальным значением $max взят первый элемент, а не 0 или другое число. Так происходит, потому что все числа в массиве могут быть меньше нуля, и тогда мы получим неверный ответ.</p>
12 <p>Обратите внимание, что начальным значением $max взят первый элемент, а не 0 или другое число. Так происходит, потому что все числа в массиве могут быть меньше нуля, и тогда мы получим неверный ответ.</p>
13 <p>Второй важный момент: мы делаем возврат только после обхода всего массива. Если бы return был внутри цикла, то мы рассмотрели массив не полностью. Такая ошибка часто встречается у новичков.</p>
13 <p>Второй важный момент: мы делаем возврат только после обхода всего массива. Если бы return был внутри цикла, то мы рассмотрели массив не полностью. Такая ошибка часто встречается у новичков.</p>
14 <h2>Нейтральный элемент</h2>
14 <h2>Нейтральный элемент</h2>
15 <p>Рассмотрим поиск суммы:</p>
15 <p>Рассмотрим поиск суммы:</p>
16 <p>Алгоритм поиска суммы значительно проще, но обладает парой важных нюансов.</p>
16 <p>Алгоритм поиска суммы значительно проще, но обладает парой важных нюансов.</p>
17 <p>Чему равна сумма элементов пустого массива? С точки зрения математики такая сумма равна нулю, что совпадает со здравым смыслом. Если у нас нет яблок, значит у нас есть ноль яблок. Функции в программировании работают по этой логике.</p>
17 <p>Чему равна сумма элементов пустого массива? С точки зрения математики такая сумма равна нулю, что совпадает со здравым смыслом. Если у нас нет яблок, значит у нас есть ноль яблок. Функции в программировании работают по этой логике.</p>
18 <p>Второй момент связан с начальным элементом суммы. В коде используется 0 или так называемый "нейтральный элемент операции сложения на множестве вещественных чисел".<a>Нейтральный элемент бинарной операции</a>используется, но ничего не меняет. Например, сложение любого числа с нулем всегда дает это же число. На практике это значит, что мы можем прибавить ноль к любому выражению и получить ту же сумму:</p>
18 <p>Второй момент связан с начальным элементом суммы. В коде используется 0 или так называемый "нейтральный элемент операции сложения на множестве вещественных чисел".<a>Нейтральный элемент бинарной операции</a>используется, но ничего не меняет. Например, сложение любого числа с нулем всегда дает это же число. На практике это значит, что мы можем прибавить ноль к любому выражению и получить ту же сумму:</p>
19 <p>Этим свойством мы и пользуемся в нашем коде. Нейтральный элемент - важная часть любой агрегирующей операции. Именно с него начинается сам процесс агрегации. В случае сложения - это 0, в случае умножения - 1.</p>
19 <p>Этим свойством мы и пользуемся в нашем коде. Нейтральный элемент - важная часть любой агрегирующей операции. Именно с него начинается сам процесс агрегации. В случае сложения - это 0, в случае умножения - 1.</p>
20 <p>Агрегация далеко не всегда означает, что коллекция элементов сводится к некоторому простому значению. Результатом агрегации может быть даже сложная структура - например, массив. Подобные примеры часто встречаются в реальной жизни. Самый простой пример - это список уникальных слов в тексте.</p>
20 <p>Агрегация далеко не всегда означает, что коллекция элементов сводится к некоторому простому значению. Результатом агрегации может быть даже сложная структура - например, массив. Подобные примеры часто встречаются в реальной жизни. Самый простой пример - это список уникальных слов в тексте.</p>