Menu
Coddy logo textTech

Reduce

Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 25 из 56.

reduce сворачивает весь массив в одно значение. С его помощью можно суммировать, перемножать, находить экстремумы или создавать новую строку или массив из множества элементов.

let total = [1, 2, 3, 4].reduce(0) { acc, n in acc + n }
print(total)                       // 10

Первый аргумент — это начальный аккумулятор. Замыкание получает текущий аккумулятор и следующий элемент, и возвращает новый аккумулятор. Конечное значение аккумулятора является результатом.

Для арифметических операторов Swift предоставляет сокращенную запись на основе символов:

[1, 2, 3, 4].reduce(0, +)              // 10
[1, 2, 3, 4].reduce(1, *)              // 24

reduce не обязательно должен возвращать число. Аккумулятор может быть любого типа, решать вам:

let sentence = ["hi", "there"].reduce("") { $0 + $1 + "!" }
print(sentence)                    // "hi!there!"
challenge icon

Задание

Легко

Прочитайте одну строку ввода: список целых чисел, разделенных запятыми. Используя reduce для каждого случая, выведите три строки:

  1. Сумма
  2. Произведение
  3. Максимальное значение (используйте замыкание, которое возвращает большее из двух аргументов, не вызывайте .max())

Предположим, что есть хотя бы один элемент. Для поиска максимума вы можете использовать nums[0] в качестве начального аккумулятора и применить reduce к остальной части массива.

Для входных данных 3,7,2,8,4 вывод будет следующим:

24
1344
8

Шпаргалка

reduce сворачивает массив в одно значение, используя начальный аккумулятор и замыкание:

let total = [1, 2, 3, 4].reduce(0) { acc, n in acc + n } // 10

Сокращенная запись для арифметических операторов:

[1, 2, 3, 4].reduce(0, +)  // 10
[1, 2, 3, 4].reduce(1, *)  // 24

Аккумулятор может быть любого типа:

["hi", "there"].reduce("") { $0 + $1 + "!" } // "hi!there!"

Чтобы найти максимум с помощью reduce, используйте первый элемент в качестве начального значения:

let maxVal = nums.dropFirst().reduce(nums[0]) { $0 > $1 ? $0 : $1 }

Попробуйте сами

let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: сумма, произведение, максимум через reduce
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком