http://bbs.chinaunix.net/thread-1258974-1-2.html
;;以下为自己所写如发现问题;;欢迎指正
;;Exercise 2.33
;;(accumulate (lambda (x y) (cons (* 2 x) y)) '() '(1 2 3 4))
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
(define (map p sequence)
(accumulate (lambda (x y) (cons (p x) y)) '() sequence))
(map (lambda (x) (* 2 x)) '(1 2 3 4))
(define (append seq1 seq2)
(accumulate cons seq2 seq1))
(append '(1 2) '(3 40))
(define (length sequence)
(accumulate (lambda (x y)
(+
(if (not (null? x)) 1 0) y) ) 0 sequence))
(length '(1 2 35 56 63 674 'nth 'thccr))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Exercise 2.34
(define (horner-eval x coefficient-sequence)
(accumulate (lambda (this-coeff higher-terms) (+ this-coeff (* x higher-terms)))
0
coefficient-sequence))
(horner-eval 2 (list 1 3 0 5 0 1))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Exercise 2.35
(define (enumerate-tree tree)
(cond ((null? tree) '())
((not (pair? tree)) (list tree))
(else (append (enumerate-tree (car tree))
(enumerate-tree (cdr tree))))))
(define (count-leaves tree)
(accumulate (lambda (x y) (+ (length x) y))
0 (map enumerate-tree tree)))
(count-leaves (list 1 (list 2 (list 3 '(4 5 6 (8 9 10)))) 7))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Exercise 3.1
(define (make-accumulator init)
(let ((next init)
(sum init))
(lambda (num)
(set! sum (+ sum num))
sum)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Exercise 3.2
(define (make-monitored f)
(let ((counter 0))
(lambda (n)
(cond ((eq? n 'how-many-calls?) counter)
((eq? n 'reset-count) (set! counter 0))
(else
(f n)
(set! counter (+ counter 1)))))))