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

results matching ""

    No results matching ""