Menu
Coddy logo textTech

Reduce

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 25 de 56.

reduce reduce un array completo a un único valor. Es la forma en que sumas, multiplicas, encuentras un extremo o construyes una nueva cadena o array a partir de muchos elementos.

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

El primer argumento es el acumulador inicial. El closure recibe el acumulador actual y el siguiente elemento, y devuelve el nuevo acumulador. El valor final del acumulador es el resultado.

Para los operadores aritméticos, Swift te ofrece la abreviatura basada en símbolos:

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

reduce no tiene por qué devolver un número. El acumulador puede ser de cualquier tipo, tú decides:

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

Desafío

Fácil

Lee una sola línea de entrada: una lista de enteros separados por comas. Usando reduce para cada uno, imprime tres líneas:

  1. La suma
  2. El producto
  3. El valor máximo (usa un cierre que devuelva el mayor de los dos argumentos, no llames a .max())

Asume al menos un elemento. Para el máximo, puedes usar nums[0] como el acumulador inicial y aplicar reduce al resto del arreglo.

Para la entrada 3,7,2,8,4, la salida es:

24
1344
8

Hoja de referencia

reduce reduce un array a un solo valor utilizando un acumulador inicial y un cierre (closure):

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

Abreviatura para operadores aritméticos:

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

El acumulador puede ser de cualquier tipo:

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

Para encontrar un máximo usando reduce, utiliza el primer elemento como valor inicial:

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

Pruébalo tú mismo

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

// TODO: suma, producto, máximo mediante reduce
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo