;right为,先算右边元素的结果,并将结果放在op的右边
;left为,先算左边元素的结果,并将结果放在op的左边
(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-left / 1 (list 1 2 3))
(define (fold-right op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(fold-right op initial (cdr sequence)))))
(display "====")
(newline)
(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))
(fold-right cons nil (list 1 2 3))
(fold-left cons nil (list 1 2 3))
(fold-left (lambda (x y) (cons y x)) nil (list 1 2 3))
(list 1 nil)
(list 2 (list 1 nil))
;(op 从右边数第一个元素 结果) 即:(/ 3 1) = 3
;(op 从右边数第二个元素 结果) 即:(/ 2 3) = 2/3
;(op 从右边数第三个元素 结果) 即:(/ 1 2/3) = 3/2 = 1右二分之一
;(op 结果 从左边数第一个元素) 即:(/ 1 1) = 1
;递归 1/2 1/6
(fold-right (lambda (x y)
(append y (list x)))
nil (list 1 2 3))
(display "====")