-
Notifications
You must be signed in to change notification settings - Fork 0
/
3.52.rkt
97 lines (82 loc) · 2.79 KB
/
3.52.rkt
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
#lang scheme
(require "./stream.rkt")
(define sum 0)
; sum => 0
(define (accum x) (set! sum (+ x sum)) sum)
; sum => 0
(define seq
(stream-map accum
(stream-enumerate-interval 1 20)))
; sum => 1
; seq => (1 (stream-map accum (stream-enumerate-interval 2 20)) )
(define y (stream-filter even? seq))
; sum => 6
; seq => (1 3 6 (stream-map accum (stream-enumerate-interval 4 20)))
; y => (6 (stream-filter even? seq:4))
(define z
(stream-filter (lambda (x) (= (remainder x 5) 0))
seq))
; sum => 10
; seq => (1 3 6 10 (stream-map accum (stream-enumerate-interval 5 20)))
; z => (10 (stream-filter (lambda (x) (= (remainder x 5) 0)) seq:5))
; y => (6 (stream-filter even? seq:4))
(stream-ref y 7)
; sum => 136
; seq => (1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136
; (stream-map accum (stream-enumerate-interval 17 20))
; y => (6 10 28 36 66 78 120 136 (stream-filter even? seq:17))
; z => (10 (stream-filter (lambda (x) (= (remainder x 5) 0)) seq:5))
; 打印信息为: 136
(display-stream z)
; sum => 210
; seq => (1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210)
; z => (10 15 45 55 105 120 190 210)
; y => (6 10 28 36 66 78 120 136 (stream-filter even? seq:17))
; 打印信息为:
; 10
; 15
; 45
; 55
; 105
; 120
; 190
; 210
;================================================
; 如果 (delay <exp>) 实现为 (lambda () <exp>)
; 则有很多重复计算,这里由于使用赋值,会导致结果异常.
; 不过这部分没有实现相关函数,所以不能验证。
; 下面是猜测的结果:
;(define sum 0)
; sum => 0
;(define (accum x) (set! sum (+ x sum)) sum)
; sum => 0
;(define seq (stream-map accum (stream-enumerate-interval 1 20)))
; sum => 1
; seq => (1 (stream-map accum (stream-enumerate-interval 2 20)) )
;(define y (stream-filter even? seq))
; sum => 6
; seq(y) => (1 3 6 (stream-map accum (stream-enumerate-interval 4 20)))
; y => (6 (stream-filter even? seq(y):4))
;(define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq))
; sum => (6+2+3+4) = 15
; seq(z) => (1 8 11 15 (stream-map accum (stream-enumerate-interval 5 20)))
; z => (15 (stream-filter (lambda (x) (= (remainder x 5) 0)) seq(z):5))
; y => (6 (stream-filter even? seq(y):4))
;(stream-ref y 7)
; sum => 162
; seq(y) => (1 3 6 19 24 30 37 45 54 64 75 87 100 114 129 145 162
; (stream-map accum (stream-enumerate-interval 18 20))
; y => (6 24 30 54 64 100 114 162 (stream-filter even? seq(y):18))
; z => (15 (stream-filter (lambda (x) (= (remainder x 5) 0)) seq(z):5))
; 打印信息为: 162
;(display-stream z)
; sum => 362
; seq(z) => (1 8 11 15 167 173 180 188 197 207 218 230 243 257 272
; 288 305 323 342 362)
; z => (15 180 230 305)
; y => (6 24 30 54 64 100 114 162 (stream-filter even? seq(y):18))
; 打印信息为:
; 15
; 180
; 230
; 305