Merhaba,

 7 Ara 2006 tarihinde Volkan YAZICI dedi ki:

> Yukarıdaki problemi çözmek için, Mehmet Bey'in önerisini dikkate
> alarak, soruya tersten yaklaşan bir Scheme betiği yazıverdim. Örnek
> çıktı şu şekilde:
>
> $ time guile -l abcd.scm -c "(display (find-valid-4s 98765))"
> ((8 930 2 5))
> real    0m5.924s
> user    0m5.616s
> sys     0m0.036s
>
> Ah, neden zaman bilgisi ile birlikte mi veriyorum? Hoca'nın odasına
> gittiğimde bana Mathematica ile yazdığı programın 8 saattir
> çalıştığını, programın daha yeni durduğunu söylemişti. Aslında aynı
> kodu CHICKEN ile C koduna çevirip derledikten sonra bir daha
> çalıştırmayı deneyecektim ama... Bir gün içinde bu kadar heyecan yeter
> bana. (Tanrı'dan beni interpreted diller için söylediğim her şeyden
> dolayı affetmesini istiyorum.)
>
>
> İyi çalışmalar.
>
> P.S. find-valid-4s fonksiyonunun o kadar uzun tutmasının nedeni, tail
> recursive call'lardan yararlanmak istememden kaynaklandı
> hep. Cevabı TRC kullanarak kümülativ olarak her döndürmeye
> çalıştığımda stack overflow oluyordu, o yüzden
> [EMAIL PROTECTED]'tekilerin yardımı bile binbir takla
> atarak kodu stack overflow vermeden TRC kullanacak hale
> getirebildik. Açıkcası bu konuda CL'cilerin oyuncaklarını da
> görmek isterim.

Hoş bir soruymuş, teşekkürler.

CL'ci değilim ama yığın taşması olmayacak bir scheme çözümü önerebilirim
sanırım (ana döngü haricinde toplayıcıya gerek duymayan). 

asıl çift özyinelemeli işlev kuyruk olmadığından birazcık daha yavaş
çalışacaktır, o noktada sizi ocaml'e davet edebiliriz :) )

(define basamakla 
  (lambda (n)
    (if (< n 10) (list n)
        (cons (remainder n 10)
              (basamakla (quotient n 10))))))
;; loglogn essizlik 
(define essiz
  (lambda (l)
    (letrec ((sorted (sort-list l <))
             (check (lambda (l) 
                      (if (not (pair? l)) #t
                          (let ((h (car l))
                                (r (check (cdr l))))
                            (and r (not (eqv? r h)) h))))))
      (check sorted))))

;; asil isi burasi yapiyor      
(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))))))))



(define ara 
  (lambda (max adet)
    (let loop ((sayi max) (topla '()))
      (if (< sayi 1) topla
          (let ((bler (basamakla (* sayi sayi))))
            (loop (- sayi 1) 
                  (append (if (essiz bler) (bul sayi 0 1 adet bler) '())
                          topla)))))))
                    
            
(display (ara 98765 4))


kolay gelsin
-- 
Büyük beyinler fikirleri, küçük beyinler insanları tartışır. (anonim)
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