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))
下面表达式的值是什么?
(fold-right / 1 (list 1 2 3))
(fold-left / 1 (list 1 2 3))
(define nil '())
(fold-right list nil (list 1 2 3))
(fold-left list nil (list 1 2 3))
如果要求用某个op时保证fold-right和fold-left对任何序列都产生同样的结果,请给出op应该满足的性质。
要 fold-right 与 fold-left 结果相同,需要 op 满足交换律。如:
(fold-right + 0 (list 1 2 3))
(fold-left + 0 (list 1 2 3))