26 iunie 2010

Generarea mai multor numere prime in Scheme

; verificam daca x se divide cu y
(define divides?
(lambda (x y)
(zero? (remainder x y)))) ; remainder x y <=> x modulo y
; definitiile pentru fluxul numerelor naturale
(define succ
(lambda (n)
(+ n 1)))
(define make_naturals
(lambda (k)
(cons k (delay (make_naturals (succ k))))))
; definim fluxul numerelor naturale incepand de la 2
(define naturals_from_2 (make_naturals 2))
; functia take
(define take
(lambda (n stream)
(if (zero? n) '()
(cons (car stream) (take (- n 1) (force (cdr stream)))))))
; functie care primeste un flux, si intoarce un flux filtrat, dupa functia f
(define filt
(lambda (f s) ; parametrii sunt functia de filtrare, si fluxul
(if (f (car s))
(cons (car s) (delay (filt f (force (cdr s)))))
(filt f (force (cdr s))))))
; functia de cernere (sita)
(define sieve
(lambda (s)
(cons (car s)
(delay (sieve (filt
(lambda (x) (not (divides? x (car s))))
(force (cdr s))))))))
; definitia fluxului
(define primes_stream (sieve naturals_from_2))
; testare
(take 10 primes_stream) ; va intoarce (2 3 5 7 11 13 17 19 23 29)

Niciun comentariu: