2011-11-29 24 views
10

için liste listesi matrisini döndürme Clojure ve genel olarak fonksiyonel programlama konusunda yeniyim. Bunu nasıl işlevsel bir şekilde halledeceğim konusunda bir kayıp yapıyorum.Clojure

aşağıdaki matrisi vardır:

Böyle bir şey haline dönüştürmek isteyen
(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

(saat yönünün tersine döndürmek): Bana elemanları verir bu biraz kesmek ettik

((\a \d \g) 
(\b \e \h) 
(\c \f \i)) 

doğru sıralamayla. Verileri bir dizide toplayabilirsem, böylelikle bölme ile ayrılabilirdim. Ancak doseq yanlış yoldur eminim: Ben iç içe haritası çağrıları ile amatörce ettik ama bu ile sıkışmış almaya devam

(doseq [i [0 1 2]] 
    (doseq [row matrix] 
    (println (get (vec row) i)))) 

. Clojure'da bir dize oluşturmanın veya bunu daha iyi bir şekilde ele almanın doğru yolu nedir?

cevap

30

transpose gibi sesleri elde etmeye çalıştığınız şey. Ben önerim ne anlama geliyor?

(apply map list '((\a \b \c) (\d \e \f) (\g \h \i))) 

üç listeden her birinin birinci elemanları alır

(map list '(\a \b \c) '(\d \e \f) '(\g \h \i)) 

eşdeğerdir, onlara listesi aramaları, daha sonra, ikinci elemanları alır onlara listesini çağırır ... An, bir dizi döner Bu şekilde oluşturulan tüm listeler.

Her ikisi de apply ve map'un birkaç örneği ClojureDocs üzerinde bulunabilir.

senin orijinaliyle aynı çıktıyı üretir
(def transposed-matrix (apply map list matrix)) 
;=> ((\a \d \g) (\b \e \h) (\c \f \i)) 

(doseq [row transposed-matrix] 
    (doall (map println row))) 

(matrix sütunlarının baskı):

+0

işaret için müthiş thx görünüyor! Teşekkürler – JustGage

9

rosettacode doğrudan matrix transposition çözüm çıkarak: Bu iyi olmasa da

(map vector [\a \b \c] [\d \e \f] [\g \h \i])

Bu keyfi matris boyutları ile güzel çalışacaktır:

(vec (apply map vector matrix))

düşünün oluyor görmek için önemli sayıda çürütme, bunun için Clojure'dan java tabanlı bir matris manipülasyon kütüphanesi kullanmayı düşünebilirsiniz.

+0

rosettacode orada Etkileyici – jm0

5

Bu tür matris değişikliklerini çok kolay bir şekilde yapmak için core.matrix'u kullanabilirsiniz. Özellikle, ne istediğinizi tam olarak yapar zaten transpose işlevi vardır:

Örnek:

(use 'clojure.core.matrix) 

(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

(transpose matrix) 
=> [[\a \d \g] 
    [\b \e \h] 
    [\c \f \i]]