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ü:
< Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 20 Ocak 2019; 15:49:10 >
Teşekkürler üstat
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme