Implement till 3.56

main
Felix Martin 2021-01-02 05:08:12 -05:00
parent b76c5b0c70
commit 8837835e01
1 changed files with 82 additions and 0 deletions

View File

@ -106,3 +106,85 @@
(display "\nex-3.53\n")
(define (add-streams s1 s2)
(stream-map + s1 s2))
(define ones (cons-stream 1 ones))
(define integers (cons-stream 1 (add-streams ones integers)))
(define (take n xs)
(if (= n 0)
'()
(cons (stream-car xs)
(take (- n 1) (stream-cdr xs)))))
(assert (take 3 integers)
'(1 2 3))
(define fibs
(cons-stream 0
(cons-stream 1
(add-streams (stream-cdr fibs)
fibs))))
(assert (take 7 fibs)
'(0 1 1 2 3 5 8))
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(define double (cons-stream 1 (scale-stream double 2)))
(assert (take 3 double)
'(1 2 4))
(define s (cons-stream 1 (add-streams s s)))
(assert (take 5 s)
'(1 2 4 8 16))
(display "\nex-3.54 - factorials\n")
(define (mul-streams s1 s2)
(stream-map * s1 s2))
(define factorials (cons-stream 1 (mul-streams (stream-cdr integers) factorials)))
(assert (take 5 factorials)
'(1 2 6 24 120))
(display "\nex-3.55 - partial-sums\n")
(define (partial-sums xs)
(cons-stream (stream-car xs)
(add-streams (partial-sums xs)
(stream-cdr xs))))
(assert (take 5 (partial-sums integers))
'(1 3 6 10 15))
(display "\nex-3.56 - enumerate multiplies of 2, 3, 5\n")
(define (merge s1 s2)
(cond ((stream-null? s1) s2)
((stream-null? s2) s1)
(else
(let ((s1car (stream-car s1))
(s2car (stream-car s2)))
(cond ((< s1car s2car)
(cons-stream s1car (merge (stream-cdr s1) s2)))
((> s1car s2car)
(cons-stream s2car (merge s1 (stream-cdr s2))))
(else
(cons-stream s1car
(merge (stream-cdr s1)
(stream-cdr s2)))))))))
(define S (cons-stream 1 (merge (merge (scale-stream S 2) (scale-stream S 3))
(scale-stream S 5))))
(assert (take 10 S)
'(1 2 3 4 5 6 8 9 10 12))
(display "\nex-3.57\n")