从 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