- 论坛徽章:
- 0
|
Exercise 3.52. 答案
[解]
- (define seq (stream-map accum (stream-enumerate-interval 1 20)))
复制代码
此语句执行后,sum=1
- (define y (stream-filter even? seq))
复制代码
此语句执行后, sum=1+2+3=6
- (define z (stream-filter (lambda (x) (= (remainder x 5) 0))
- seq))
复制代码
此语句执行后, sum=6+4=10
此语句执行时,seq 前 4 项已知,后面的要动态计算,取其中第 8 个偶数。seq 的第 n 项为正整数列的前 n 项之和 n(n+1)/2,为偶数仅当 n=3,0 (mod 4)。所以 n=3, 4, 7, 8, 11, 12, 15, 16.
(stream-ref y 7) 的值为 16(16+1)/2=136. 如果在交互环境,输出 135,如果是脚本运行模式,没有输出。
此语句输出 seq 中的全部能被 5 整除的数。n(n+1)/2 为 5 的倍数,当且仅当 n=4,0 (mod 5)。所以 n 取 4,5,9,10,14,15,19,20. 由于
(map (lambda (n) (/ (* n (+ n 1)) 2)) '(4 5 9 10 14 15 19 20))
得到
(10 15 45 55 105 120 190 210)
所以输出为:
10
15
45
55
105
120
190
210
========================================
如果没有使用 memo-proc 优化,则 force 不保存首次求值的结果。
(1) define seq, sum=1
(2) define y, sum=6
(3) define z,
由于 seq 的第一项不是 promise,所以不产生累加 sum 的副作用。
sum=6+2+3+4=15
(4) (stream-ref y 7)
从流 y 中提第 8 个数,即用 stream-filter 在 seq 中提取第 8 个偶数。此时 seq 的通项为
s(n)=15+n(n+1)/2-6,其中 n>=4
s(n) 为偶数,相当于 n(n+1)/2=1 (mod 4),化简有 (n-1)(n-2)=0 (mod 4),即 n=1,2 (mod 4)
这样的 n 依次为 5, 6, 9, 10, 13, 14, 17. 所以 (stream-ref y 7) 的值,也就是 sum 的当前值为 s(17)=162
(5) (display-steam z)
此表达式遍历流 z,而 z 是 stream-filter 过滤 seq, 提取 5 的倍数得到的列表。
此时 seq 的通项为:
t(n)=162+n(n+1)/2-10,其中 4 < n < 21
5|t(n),相当于 n(n+1)/2=3 (mod 5),化简有 (n-2)^2=0 (5).
即 n=2 (mod 5)
这样的 n 依次为 7, 12 17。所以该语句的输出为:15, t(7), t(12), t(17), 即
15
180
230
305
而 sum 的当前值为 t(20)=362.
[ 本帖最后由 win_hate 于 2008-9-2 23:36 编辑 ] |
|