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>