---- Mehmet Yavuz Selim Soyturk <[EMAIL PROTECTED]> demiş ki:
> Problemi problemi scheme ile cozmeye calistim. Biraz sac bas yoldum,
> ama sonra soyle birsey ortaya cikti:
>
> (define (comb liste)
> (let comb-help ((lst liste) (builded '(()) ))
> (if (null? lst) builded
> (comb-help (cdr lst)
> (append builded
> (map (lambda (x)
> (cons (car lst) x))
> builded))))))
>
>
> Sonra diger kodlarla karsilastiridm. Forcer'in koduna benziyor, fakat
> accumulator teknigini kullanarak tail-recursive olmasini sagladim.
> Biraz daha hizli olacagini tahmin ediyorum.
Ben böyle yaptığım zaman #scheme kanalında hala C gibi düşünüp, Lisp ile
yazdığımı söylüyorlar. (Olması gereken Lisp gibi düşünüp, Lisp ile yazmakmış.)
Imperative yaza yaza, alışkanlık genlerime işlemiş.
Benden de Bülent Bey'in önerisi için bir Scheme parçası:
(define (filter-using-bits bits s)
(cond ((or (null? bits) (null? s)) '())
((eq? (car bits) 1) (cons (car s)
(filter-using-bits (cdr bits) (cdr s))))
(else (filter-using-bits (cdr bits) (cdr s)))))
(define (pow-of-2 u)
(arithmetic-shift 2 (- u 1)))
(define (to-base num base)
(if (< num base) (list num)
(append (to-base (arithmetic-shift num -1) base)
(list (modulo num base)))))
(define (to-bits num) (to-base num 2))
(define (combinations lst)
(let ((maxnum (pow-of-2 (length lst))))
(let loop ((num 1))
(if (>= num maxnum) '()
(cons (filter-using-bits (to-bits num) lst)
(loop (+ num 2)))))))
to-base tanımlamasında append yerine cons kullanmak başarımı biraz daha
arttırabilir sanırım.
> Ayni kodun haskell karsiligi:
>
> comb lst = comb' lst [[]]
> where comb' [] builded = builded
> comb' (x:xs) builded = comb' xs (builded ++ (map (x:) builded))
Sanırım listede ne Common Lisp, ne de Haskell bilmeyen bir ben varım. :-)
İyi çalışmalar.
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp