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))

results matching ""

    No results matching ""