SICP 习题参考答案(转)


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

转载于:https://my.oschina.net/luyuhx/blog/120608

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值