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

Cevap