Reduce / Inject
Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 23 z 56.
Czasami trzeba zredukować całą tablicę do jednej wartości: sumy, iloczynu lub najdłuższego ciągu znaków. Narzędziem do tego jest reduce (nazywane też inject: ta sama metoda, dwie nazwy).
Blok przyjmuje dwa parametry: akumulator i bieżący element. Wartość zwracana przez blok staje się następnym akumulatorem.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Krok po kroku akumulator przyjmuje wartości 0 → 1 → 3 → 6 → 10.
Pierwszy argument to wartość początkowa akumulatora. Jeśli go pominiesz, Ruby użyje pierwszego elementu tablicy:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24W przypadku prostych operacji, takich jak suma i iloczyn, Ruby oferuje skrót: przekaż symbol zamiast bloku:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Gdy potrafisz zbudować własny akumulator, możesz obliczyć niemal wszystko w jednym przebiegu.
Wyzwanie
ŁatwyWczytaj listę liczb całkowitych oddzielonych przecinkami. Wypisz trzy wiersze:
- Sumę (użyj
reduce(:+)) - Iloczyn (użyj
reduce(:*)) - Maksimum, obliczone za pomocą
reducei jawnego bloku, nie używającmax.
Dla danych wejściowych 2,5,3,8 wynik to:
18
240
8Spróbuj swoich sił
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: wypisz sumę, iloczyn i maksimum (używając reduce + jawnego bloku)
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocenPoćwicz samodzielnie: Kompilator Ruby online