练习 1.32

sumproduct ,我们可以进一步抽象出『累积』的概念,并将它写成相应的 accumulate 函数,它和之前的 sumproduct 函数都非常相似:

;;; 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))))

重定义 sum 和 product

接着,使用 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

迭代版的 accumulate 和之前迭代版的 sumproduct 都非常相似:

;;; 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

讨论

blog comments powered by Disqus