summaryrefslogtreecommitdiff
path: root/coding-exercises/3/3.5.2/53.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises/3/3.5.2/53.rkt')
-rw-r--r--coding-exercises/3/3.5.2/53.rkt43
1 files changed, 43 insertions, 0 deletions
diff --git a/coding-exercises/3/3.5.2/53.rkt b/coding-exercises/3/3.5.2/53.rkt
new file mode 100644
index 0000000..776e619
--- /dev/null
+++ b/coding-exercises/3/3.5.2/53.rkt
@@ -0,0 +1,43 @@
+#lang racket
+(require "../../../shared/sicp-stream.rkt")
+(newline) (print "54") (newline)
+(define (add-streams s1 s2) (stream-map + s1 s2))
+(define (scale-stream s factor) (stream-map (lambda (x) (* factor x)) s))
+(define (mul-streams s1 s2) (stream-map * s1 s2))
+(define ones (stream-cons 1 ones))
+(define integers (stream-cons 1 (add-streams ones integers)))
+(define factorials (stream-cons 1 (mul-streams integers factorials)))
+(stream-ref factorials 5)
+
+(newline) (print "55") (newline)
+(define (partial-sums s)
+ (define me (stream-cons 0 (add-streams s me)))
+ me)
+(stream-ref (partial-sums integers) 4)
+
+(newline) (print "56") (newline)
+(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)
+ (stream-cons s1car (merge (stream-cdr s1) s2)))
+ ((> s1car s2car)
+ (stream-cons s2car (merge s1 (stream-cdr s2))))
+ (else
+ (stream-cons s1car
+ (merge (stream-cdr s1)
+ (stream-cdr s2)))))))))
+(define S (stream-cons 1 (merge (scale-stream S 2) (merge (scale-stream S 3) (scale-stream S 5)))))
+
+(newline) (print "57") (newline)
+(define additions 0)
+(define (add-streams-counted s1 s2) (stream-map (lambda (x y) (set! additions (+ additions 1)) (+ x y)) s1 s2))
+(define fibs (stream-cons 0
+ (stream-cons 1
+ (add-streams-counted (stream-cdr fibs)
+ fibs))))
+(stream-ref fibs 20)
+(println additions) (newline) (println "Streams in racket are forced when car is called.")