Skip to content

Latest commit

 

History

History
37 lines (28 loc) · 1.16 KB

2.38.md

File metadata and controls

37 lines (28 loc) · 1.16 KB

2.26

Question

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.

Answer

(fold-right / 1 (list 1 2 3)) ; 3/2
(fold-left / 1 (list 1 2 3)) ; 1/6
(fold-right list nil (list 1 2 3)) ; (list 1 (list 2 (list 3 ())))
(fold-left list nil (list 1 2 3)) ; (list (list (list () 1) 2) 3)

op should be commutative for fold-right and fold-left to converge: in other words, (op x y) = (op y x).