Giriş
Bu yazımız görsel ağırlıklı olacak.
Reduce
, boyutu küçültme anlamına gelir. Bir array üzerinde işlem yapıp, daha küçük boyutlu (genellikle tek elemanlı) bir dizi elde etme işlemi Reduce
, SQL ifadesiyle bir Aggregate
işlemidir.
Aslında Filter
işlemi de Reduce
ile tanımlanabilse de genellikle Reduce
işlemi sonucunda tek elemanlı bir sonuç çıkması gerektiği farzedilir.
1 ile 6 arasındaki sayılar bir array, bu sayıların toplamı veya faktöryeli ise bir Reduce
işlemidir.
Reduce Uygulaması
Reduce
algoritmasını uygulayabilmek için:
- İlk adımda array’in ilk iki elemanı alınır ve
Reducer
fonksiyonu ile ilk değer hesaplanır - Diğer adımlarda
Reducer
fonksiyonun ilk parametresi geçmişten gelen sonuç, diğer parametre ise array’in bir sonraki elemanı olur. - Son elemana gelindiğinde
Reducer
fonksiyonundan çıkan değer sonuç olur. - Bazı durumlarda
Reducer
fonksiyonu için başlangıç değeri (seed
) verilir böylece ilk adımda array’in ilk elemanı ile bu değerreducer
fonksiyonuna girer.
Örnek
1’den 6’ya kadar olan sayıları toplamak için Pseudo kodu yazıp ve fonksiyon akışını modelleyelim.
1[1,2,3,4,5,6]
2
3reducer(a,b) -> return a + b;
4
51. reducer(1,2) => 3
62. reducer(3,3) => 6
73. reducer(6,4) => 10
84. reducer(10,5) => 15
95. reducer(15, 6) => 21
10 ^^
Burada 1,3,6,10, 15
değerlerinin ara sonuçlar olduğuna dikkat edin. Her bir ara sonuç, dizinin bir sonraki elemanıyla reducer
fonksiyonuna giriyor ve bir sonraki sonucu hesaplıyor.
C# ile Reduce
1static T reduce<T>(IEnumerable<T> values, Func<T, T, T> reducer)
2{
3 if (!values.Any())
4 return default;
5
6 var enumerator = values.GetEnumerator();
7 _ = enumerator.MoveNext();
8
9 var current = enumerator.Current;
10
11 T next;
12
13 while (enumerator.MoveNext())
14 {
15 next = enumerator.Current;
16 current = reducer(current, next);
17 }
18
19 return current;
20}