Python için süzme işlemi gösterdin. Hızlı sıralamaya biraz aşağıda geçeceğim.
Bu konularda kullanışlı olan iki olanak oluyor: Generator kavramı Python'da iç olanak olduğu halde D'deki aralık (range) kavramı kütüphanelerle gerçekleştirilmek durumunda. Ancak, aralıkların bütünüyle kütüphane olanağı olduğunu söylemek de yanlış olur çünkü foreach döngüsü InputRange aralığı kavramını tanır ve foreach ile rahatça kullanma olanağı sunar. O açıdan bakınca biraz da dilin iç olanağı kabul edilebilir.
Gösterdiğin kod D'de neredeyse aynı (Not: tek sayı karşılaştırmasınd ==1 yapılırsa eksi sayılarda yanlış sonuç verir):
import std.algorithm;
// ...
immutable sayılar = [1, 2, 3, 4, 5, 6];
auto tekSayılar = sayılar.filter!(x => x % 2)();
(Not: dmd'nin -property seçeneği kullanılmazsa sondaki boş parantezlere de gerek olmuyor. Bu konunun sonu nereye varacak bilmiyorum. Parantezsiz yazıma izin verilmeyeceğı söyleniyor ama bazı durumlarda çok da kullanışlı olduğu için herhalde hiç kalkmayacak.)
Yukarıdaki kod da Python'da olduğu gibi tembeldir. Yani sayılar sonsuz bir aralık bile olsa filter sonsuza kadar devam etmez, sayıları gerçekten kullanıldıklarında üretir.
Hızlı sıralama en iyi özyinelemeli olarak gerçekleştirilir. Ama isimsiz işlevler ve özyineleme bir araya gelemiyor çünkü bir isimsiz işlevin içinden kendisini çağırma olanağı yok (çünkü ismi yok :)).
Erdem hile yaptım diye bana kızacak ama ben hızlı sıralamayı şöyle gerçekleştirirdim: :)
import std.stdio;
import std.algorithm;
void hızlıSırala(T)(T[] elemanlar)
{
if (elemanlar.length >= 2) {
auto parçalar = partition3(elemanlar, elemanlar[$ / 2]);
hızlıSırala(parçalar[0]);
// parçalar[1] pivot'a eşit olanları kapsıyor; zaten doğru yerdeler
hızlıSırala(parçalar[2]);
}
}
void main()
{
auto sayılar = [ 10, 40, 0, -3, 7, 8, 11, 100, -5, 1 ];
hızlıSırala(sayılar);
writeln(sayılar);
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]