-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEx3_53.scm
107 lines (82 loc) · 2.44 KB
/
Ex3_53.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
(define stream-null? null?)
(define the-empty-stream '())
(define stream-car
(lambda (s)
(car (force s))))
(define stream-cdr
(lambda (s)
(cdr (force s))))
(define (stream-map proc . argstreams)
(if (stream-null? (car argstreams))
the-empty-stream
(delay (cons
(apply proc (map stream-car argstreams))
(apply stream-map
(cons proc (map stream-cdr argstreams)))))))
(define (stream-enumerate-interval low high)
(if (> low high)
the-empty-stream
(delay (cons
low
(stream-enumerate-interval (+ low 1) high)))))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define (stream-filter pred stream)
(cond ((stream-null? stream) the-empty-stream)
((pred (stream-car))
(delay (cons (stream-car stream)
(stream-filter pred
(stream-cdr stream)))))
(else (stream-filter pred (stream-cdr stream)))))
(define (add-stream s1 s2)
(stream-map + s1 s2))
;;; 2的n次幂
(define s (delay (cons 1 (add-stream s s))))
(stream-ref s 4)
;; Ex3_54
(define (integer-starting-from n)
(delay (cons n (integer-starting-from (+ n 1)))))
(define integers (integer-starting-from 1))
(define (mul-stream s1 s2)
(stream-map * s1 s2))
(define factorials (delay (cons 1 (mul-stream factorials (stream-cdr integers)))))
(stream-ref factorials 3)
;; Ex3_55
(define (partial-sums s)
(delay
(cons (stream-car s)
(add-stream (stream-cdr s) (partial-sums s)))))
(stream-ref (partial-sums integers) 3)
;; Ex3_56
(define (scale-stream stream factor)
(stream-map (lambda (x) (* x factor)) stream))
(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)
(delay (cons s1car
(merge (stream-cdr s1) s2))))
((> s1car s2car)
(delay (cons s2car
(merge s1 (stream-cdr s2)))))
(else
(delay (cons s1car
(merge (stream-cdr s1)
(stream-cdr s2))))))))))
(define S (delay (cons 1 (merge (merge (scale-stream S 2) (scale-stream S 3))
(scale-stream S 5)))))
;; Ex3_59
(define ones (delay (cons 1 ones)))
(define (integrate-series s)
(stream-map * (stream-map / ones integers) s))
(define sine-series (delay
(cons 0 (integrate-series cosine-series))))
(define cosine-series (delay
(cons 1 (integrate-series (scale-stream
sine-series
-1)))))