Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
1722
Tıklama
0
Öne Çıkarma
Kombinasyon oluşturma Yardım
T
7 yıl
Er
Konu Sahibi

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?



İ
7 yıl
Onbaşı

recursive fonksiyonlar ile yapabilirsin.



T
7 yıl
Er
Konu Sahibi

teşekkürler



T
7 yıl
Yarbay

@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ü:

< Resime gitmek için tıklayın >





< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 20 Ocak 2019; 15:49:10 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @iibysinyorii
T
7 yıl
Er
Konu Sahibi

Teşekkürler üstat




Bu mesajda bahsedilenler: @revivo72
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.