从 sum 和 product ,我们可以进一步抽象出『累积』的概念,并将它写成相应的 accumulate 函数,它和之前的 sum 和 product 函数都非常相似:
;;; 32-rec-accumulate.scm
(define (accumulate combiner null-value term a next b)
(if (> a b)
null-value
(combiner (term a)
(accumulate combiner
null-value
term
(next a)
next
b))))
接着,使用 accumulate 函数重定义 sum :
;;; 32-sum.scm
(load "32-rec-accumulate.scm")
(define (sum term a next b)
(accumulate +
0
term
a
next
b))
还有 product 函数:
;;; 32-product.scm
(load "32-rec-accumulate.scm")
(define (product term a next b)
(accumulate *
1
term
a
next
b))
测试新的 sum :
1 ]=> (load "32-sum.scm")
;Loading "32-sum.scm"...
; Loading "32-rec-accumulate.scm"... done
;... done
;Value: sum
1 ]=> (sum (lambda (x) x)
1
(lambda (i) (+ i 1))
10)
;Value: 55
测试新的 product :
1 ]=> (load "32-product.scm")
;Loading "32-product.scm"...
; Loading "32-rec-accumulate.scm"... done
;... done
;Value: product
1 ]=> (product (lambda (x) x)
1
(lambda (i) (+ i 1))
10)
;Value: 3628800
迭代版的 accumulate 和之前迭代版的 sum 和 product 都非常相似:
;;; 32-iter-accumulate.scm
(define (accumulate combiner null-value term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a)
(combiner result (term a)))))
(iter a null-value))
测试:
1 ]=> (load "32-iter-accumulate.scm")
;Loading "32-iter-accumulate.scm"... done
;Value: accumulate
1 ]=> (accumulate +
0
(lambda (x) x)
1
(lambda (i) (+ i 1))
10)
;Value: 55