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, *) // 24reduce не обязательно должен возвращать число. Аккумулятор может быть любого типа, решать вам:
let sentence = ["hi", "there"].reduce("") { $0 + $1 + "!" }
print(sentence) // "hi!there!"Задание
ЛегкоПрочитайте одну строку ввода: список целых чисел, разделенных запятыми. Используя reduce для каждого случая, выведите три строки:
- Сумма
- Произведение
- Максимальное значение (используйте замыкание, которое возвращает большее из двух аргументов, не вызывайте
.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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря