2.38
; The accumulate procedure is also known as fold-right, because it combines
; the first element of the sequence with the result of combining all the
; elements to the right. There is also a fold-left, which is similar to fold-right,
; except that it combines elements working in the opposite direction:
(define (fold-left op initial sequence)
(define (iter result rest)
(if (null? rest)
result
(iter (op result (car rest))
(cdr rest))))
(iter initial sequence))
; What are the values of
; (fold-right / 1 (list 1 2 3))
; (fold-left / 1 (list 1 2 3))
; (fold-right list nil (list 1 2 3))
; (fold-left list nil (list 1 2 3))
;
; Give a property that op should satisfy to guarantee that fold-right and fold-left
; will produce the same values for any sequence.
(define nil '())
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence) (accumulate op initial (cdr sequence)))))
(define fold-right accumulate)
(fold-right / 1 (list 1 2 3)) ;Value: 3/2 (3/2/1)
(fold-left / 1 (list 1 2 3)) ;Value: 1/6 (1/2/3)
(fold-right list nil (list 1 2 3)) ; (1 (2 (3 ())))
(fold-left list nil (list 1 2 3)) ; (((() 1) 2) 3)
; For `fold-left` and `fold-right` to produce same result,
; `op` should be Commutative and Associative