diff --git a/ex-3_50-xx.scm b/ex-3_50-xx.scm index 4981c42..042f5da 100644 --- a/ex-3_50-xx.scm +++ b/ex-3_50-xx.scm @@ -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") +