Şimdi Ara

Kombinasyon oluşturma Yardım

Bu Konudaki Kullanıcılar:
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
1.715
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar merhaba,
    birçok değişkenin olası her kombinasyonunu birer birer hücrelere yazdırmak istiyorum. Kombinasyon sayısını bulmak değil derdim. Amacım değişkenlerin isimlerini ben vereceğim (örneğin: a, b, c, d) sonra bana a b, a c, a c b, a c d, a c b d, ... gibi farklı kombinasyonlarını verecek bir şey lazım. sıralama önemli değil burada. Nasıl yaparız?



  • recursive fonksiyonlar ile yapabilirsin.
  • teşekkürler
  • @iibysinyorii rekursive fonksiyonla sinyal vermiş ancak nasıl uygulanacağını belirtmemiş. Yani konsept var, implementasyon yok :)

    Kombinasyon algoritması: (a, b, c d) şeklinde 4 elemanlı listede

    1- hiçbir elemanı alma: boş liste (bu da bir kombinasyon)
    2- sonraki ilk elemanı al: a
    (burası ilginç)
    3- bu 2 elemanı kombinasyon olarak listele: ((boş), (a))
    ve bu süreci liste sonuna gelene kadar uygulayarak her bir kombinasyonu ekle

    a'dan sonraki eleman b olduğuna göre:

    ( (boş) (a) ) ile b'yi kombinasyon olarak listelediğimzde: ( (b) (b a) ) 'yı eklediğimizde: ( (boş) (a) (b) (b a) )

    c 'yi komb olarak listelediğmizde: ( (c) (c a) (c b) (c b a) ) ve eklediğimizde: ( (boş) (a) (b) (b a) (c) (c a) (c b) (c b a) )

    d 'yi kombi olarak listelediğimizde: ( (d) (d a) (d b) (d b a) (d c) (d c a) (d c b) (d c b a)) ve eklediğimizde:
    ( (boş) (a) (b) (b a) (c) (c a) (c b) (c b a) (d) (d a) (d b) (d b a) (d c) (d c a) (d c b) (d c b a) )

    Yani görüldüğü gibi eklenen her eleman ile kombinasyon sayısı 2x artmakta. Listede 4 eleman olduğundan 2^4 = 16 kombinasyon oluşmakta.

    Bu algoritmanın bir implementasyonunu yapalım. Recursive / rekürsif algoritmalar için SML ve Haskell gibi matematik temelli / fonksiyonel diller en uygunu olmakla birlikte, daha yaygın kullanıldığı için bu işi Common Lisp ile yapmak daha kolay:


    (defun kombo (liste) ; liste örnek olarak (a b c)
    (if (null liste) ; liste bos ise
    '(nil) ; nil listesi '(()) döndür
    ;;liste dolu ise alttaki let* blogunu calistir
    (let* ((a (car liste)); a = listedeki ilk eleman
    (rest (kombo (cdr liste))); rest = ilk elemandan sonraki
    ; kombinasyonlar (rekursif)
    (first (mapcar (lambda (x) (cons a x)) rest))
    ) ; first = ilk eleman + rest 'in map'lenmesi.
    ; ve sonra append edilmesi yani ornegin:
    ; first = (a) rest = (b c) (b) (c) NIL ise
    ; append sonrasinda: (a b c) (a b) (a c) (a) olacaktir
    (append first rest)
    ))) ; ve tum kombinasyonlar (a b c) (a b) (a c) (a) (b c) (b) (c) NIL
    ; seklinde tamamlanacaktır. NIL hicbir sey anlamındadır cunku
    ; kombinasyonun matematik taniminda hicbir sey de dahildir.


    Clozure Common Lisp kurulu Windows XP 'de Emacs editörde denediğim Common Lisp ekran görüntüsü:

     Kombinasyon oluşturma Yardım



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 20 Ocak 2019; 15:49:10 >
  • Teşekkürler üstat
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.