Menu
Coddy logo textTech

Reduce / Inject

Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 23 / 56.

Bazen bir dizinin tamamını tek bir değere, bir toplama, bir çarpıma veya en uzun dizeye indirgemeniz gerekir. reduce (aynı zamanda inject olarak da adlandırılır: aynı metod, iki isim) bu iş için kullanılan araçtır.

Blok iki parametre alır: biriktirici (accumulator) ve geçerli öğe. Bloğun dönüş değeri bir sonraki biriktirici olur.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total   # 10

Adım adım biriktirici şöyledir: 0 → 1 → 3 → 6 → 10.

İlk argüman, biriktiricinin (accumulator) başlangıç değeridir. Eğer bunu belirtmezseniz, Ruby dizinin ilk elemanını kullanır:

[1, 2, 3, 4].reduce { |acc, n| acc * n }   # 24

Toplam ve çarpım gibi saf işlemler için Ruby size bir kısayol sunar; bir blok yerine bir sembol geçirin:

[1, 2, 3, 4].reduce(:+)   # 10
[1, 2, 3, 4].reduce(:*)   # 24

Özel bir biriktirici (accumulator) oluşturabildiğinizde, neredeyse her şeyi tek bir geçişte hesaplayabilirsiniz.

challenge icon

Görev

Kolay

Virgülle ayrılmış bir tam sayı listesi okuyun. Üç satır yazdırın:

  1. Toplam (reduce(:+) kullanın)
  2. Çarpım (reduce(:*) kullanın)
  3. reduce ve açık bir blok ile hesaplanan maksimum değer, max kullanılmamalıdır.

2,5,3,8 girdisi için çıktı şöyledir:

18
240
8

Kopya kağıdı

reduce (takma ad: inject), bir diziyi tek bir değere indirger. Blok, bir biriktirici (accumulator) ve mevcut öğeyi alır; dönen değer bir sonraki biriktirici olur.

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

İlk öğeyi başlangıç biriktiricisi olarak kullanmak için başlangıç değerini belirtmeyebilirsiniz:

[1, 2, 3, 4].reduce { |acc, n| acc * n }  # 24

Basit işlemler için kısayol olarak bir sembol (symbol) geçirin:

[1, 2, 3, 4].reduce(:+)  # 10
[1, 2, 3, 4].reduce(:*)  # 24

Kendin dene

numbers = gets.chomp.split(",").map(&:to_i)

# YAPILACAK: toplamı, çarpımı ve maksimumu yazdır (reduce + açık blok ile)
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler