Menu
Coddy logo textTech

Reduce

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 25 sur 56.

reduce réduit un tableau entier en une seule valeur. C'est ainsi que vous additionnez, multipliez, trouvez un extrême ou construisez une nouvelle chaîne ou un nouveau tableau à partir de nombreux éléments.

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

Le premier argument est l'accumulateur initial. La closure reçoit l'accumulateur actuel et l'élément suivant, et renvoie le nouvel accumulateur. La valeur finale de l'accumulateur est le résultat.

Pour les opérateurs arithmétiques, Swift vous propose un raccourci basé sur les symboles :

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

reduce n'a pas besoin de retourner un nombre. L'accumulateur peut être de n'importe quel type, c'est vous qui décidez :

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

Défi

Facile

Lisez une seule ligne d'entrée : une liste d'entiers séparés par des virgules. En utilisant reduce pour chacun, affichez trois lignes :

  1. La somme
  2. Le produit
  3. La valeur maximale (utilisez une fermeture qui renvoie le plus grand des deux arguments, n'appelez pas .max())

Supposez qu'il y a au moins un élément. Pour le maximum, vous pouvez utiliser nums[0] comme accumulateur initial et réduire le reste du tableau.

Pour l'entrée 3,7,2,8,4, la sortie est :

24
1344
8

Aide-mémoire

reduce réduit un tableau en une seule valeur en utilisant un accumulateur initial et une closure :

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

Raccourci pour les opérateurs arithmétiques :

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

L'accumulateur peut être de n'importe quel type :

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

Pour trouver un maximum en utilisant reduce, utilisez le premier élément comme valeur initiale :

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

Essayez vous-même

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

// TODO: somme, produit, max via reduce
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux