乐正

Actions speak louder than words.

Sicp-ex3-52

问题

考虑下面的表达式序列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define sum 0)

(define (accum x)
  (set! sum (+ x sum))
  sum)

(define seq (stream-map accum (stream-enumerate-interval 1 20)))
(define y (stream-filter even? seq))
(define z (stream-filter (lambda (x) (= (remainder x 5) 0))
                         seq))

(stream-ref y 7)

(display-stream z)

在上面每个表达式求值之后sum的值是什么?求值其中的stream-refdisplay-stream表达式将打印出什么响应?如果我们简单地将(display <exp>)实现为lambda () <exp>,而不使用memo-proc所提供的优化,这些响应会有什么不同吗?请给出解释。

解答

前两个表达式执行后,sum的值都是0。到第三行表达式执行的时候,stream-map会调用一次(accum 1),所以,sum会变成1。到了第四行,stream-filter会找到第一个偶数为止,这个时候sum的值变成了6。执行第五个表达式的时候,sum变成了10。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define sum 0) ; => sum = 0

(define (accum x)
  (set! sum (+ x sum)) ; => sum = 0
  sum)

(define seq (stream-map accum (stream-enumerate-interval 1 20))) ; => sum = 1
(define y (stream-filter even? seq)) ; => sum = 6
(define z (stream-filter (lambda (x) (= (remainder x 5) 0)) ; => sum = 10
                         seq))

(stream-ref y 7) ; => sum = 136

(display-stream z) ; => sum = 210

如果不使用优化的话,sum的值会随着调用次数而无限制的上升。

draft

« sicp-ex3-51 sicp-ex3-53 »

Comments