21 Ara 2006 tarihinde Volkan YAZICI dedi ki: > Merhaba, Merhaba, iki haftadır bilgisayar ortamlarından uzaktım o yüzden cevap biraz geç geliyor, kusura bakmayın.
> On Dec 11 05:42, Alphan Bayazit wrote: >> (define bul >> (lambda (toplam elde carpan adet l) >> (if (not (pair? l)) '() >> (let* ((h (car l)) >> (t (cdr l)) >> (son (+ elde (* h carpan))) >> (kalan (- toplam son))) >> (cond >> ((or (< adet 1) (< kalan 0)) '()) >> ((not (pair? t)) (if (and (= kalan 0) (= adet 1)) >> (list (list son)) '())) >> (else (append (map (lambda (x) (cons son x)) >> (bul kalan 0 1 (- adet 1) t)) >> (bul toplam son (* carpan 10) adet t)))))))) > > Şu an elimin altında düzgün bir Scheme debugger'ı yok. (Kimin var ki?) > DIPSLAY, FORMAT kullanarak ilerlemeye çalıştığımda da bazı soru > işaretleri kaldı aklımda. Acaba yukarıdaki fonksiyonun işleyişi > hakkında biraz bahsetmeniz mümkün mü? (Özellikle merak ettiğim, aranan > sayıların birden fazla haneli olması olasılığının nasıl > değerlendirildiği.) algoritma tek ve birden fazla haneli sayı ayrımı yapmıyor, sayılar 1 ile n arasında haneli olabilir. temel (sonlandırıcı) adımda biraz "budaklama" var, onun dışında basit o yüzden sadece "çıkarım" adımını açıklamaya çalışayım. O kısım da şundan ibaret: (append (map (lambda (x) (cons son x)) (bul kalan 0 1 (- adet 1) t)) (bul toplam son (* carpan 10) adet t)) iki bul (öz)çağırısı var gördüğünüz gibi, *ikincisi* bulunduğumuz basamağın ait olduğu sayının bitmeme durumunu (olasılığını) inceliyor. Bu nedenle aradığımı sayıların adetinde azalma olmuyor çünkü bir sonraki basamak da mevcut sayıya ait olacak. örneğin ..1234.. gibi bir abcd sayısında b 234 olsun mevcut basamak 3, mevcut carpan 10, mevcut elde 4. buna göre yeni çağrıda elde 34 olmalı çarpan 100 (böylece o çağrıda basamağın kaçla çarpılacağı bilinecek). Ya da bir sonraki basamağın olası sayının kaçıncı basamağı olduğu bilgisi olarak düşünebilirsiniz. *İlki* ise mevcut basamağın olası sayının son (en büyük) basamağı olma durumunu inceliyor. O nedenle adet 1 azaltılıyor, çarpan 1'e indiriliyor. Yukarıdaki örnekten devam edersek, basamak 2 elde 34 çarpan 100 iken, sayının 234 olma durumu (yani 1234 değil sadece 234) inceleniyor Bir sonraki basamak başka bir sayının ilk (en küçük) basamağı olacağından çarpan 1'e indiriliyor, çözüme map ile 234 ekleniyor. Örnek nedeniyle karışıklık olmasın, her iki durum da her basamak için inceleniyor. > > İyi çalışmalar. size de --------------- Bu alana reklam veremeyebilirsiniz! http://www.bayazit.net/alphan/ _______________________________________________ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp