MiddleКодЧастоЕщё не отвечали
Перепишите накапливающий цикл через reduce, затем реализуйте свой reduce
Накапливающий цикл for суммирует массив. Перепишите его одним вызовом reduce, затем реализуйте свой myReduce с той же формой, что и в стандартной библиотеке.
Ограничения:
- Переписанный вариант — одно выражение с
reduce. myReduceпринимает начальное значение и комбинирующее замыкание; не вызывайте встроенныйreduce.
extension Array {
func myReduce<R>(_ initial: R, _ next: (R, Element) -> R) -> R {
// ваш код здесь
}
}
Допишите реализацию.
Цикл превращается в xs.reduce(0, +). reduce сворачивает последовательность в одно значение, прогоняя аккумулятор через комбинирующее замыкание. Ваш myReduce стартует с initial, проходит по self, переприсваивает result = next(result, element) на каждый элемент и возвращает итоговый аккумулятор.
- ✗Путают
reduce(свёртка в одно значение) сmap(поэлементное преобразование) - ✗Забывают, что
reduceтребует начального значения аккумулятора - ✗Думают, что
reduceменяет исходную последовательность
- →Когда
reduce(into:)предпочтительнееreduce(_:_:)? - →Чем
reduceотличается отmapс последующим суммированием?
Цикл for n in xs { sum += n } становится xs.reduce(0, +). Своя реализация повторяет ту же свёртку:
extension Array {
func myReduce<R>(_ initial: R, _ next: (R, Element) -> R) -> R {
var result = initial
for element in self {
result = next(result, element)
}
return result
}
}
[1, 2, 3, 4].myReduce(0, +) // 10
reduce не преобразует и не мутирует массив: он стартует с initial и на каждом элементе переприсваивает аккумулятор результатом next, возвращая финальное значение.