2.38
练习 2.38 过程accumulate也称为fold-right,因为它将序列的第一个元素组合到右边所有元素的组合结果上。也有一个fold-left,它与fold-right类似,但却是按照相反方向去操作各个元素:
(define (fold-left op initial sequence)
(define (iter result rest)
(if (null? rest)
result
(iter (op result (car rest))
(cdr rest))))
(iter initial sequence))
x#<undef>
下面表达式的值是什么?
(fold-right / 1 (list 1 2 3))
1.5
(fold-left / 1 (list 1 2 3))
0.16666666666666666
(define nil '())
(fold-right list nil (list 1 2 3))
(1 (2 (3 nil)))
(fold-left list nil (list 1 2 3))
(((nil 1) 2) 3)
如果要求用某个op时保证fold-right和fold-left对任何序列都产生同样的结果,请给出op应该满足的性质。
要 fold-right 与 fold-left 结果相同,需要 op 满足交换律。如:
(fold-right + 0 (list 1 2 3))
6
(fold-left + 0 (list 1 2 3))
6