练习2.35 将2.2.2节的count-leave重新定义为一个累积
点击查看代码
(define (count-leave t)(accumulate + 0 (map (lambda (sub-tree)(if (pair? sub-tree)(count-leave sub-tree)1))t)))
点击查看代码
(define (accumulate-n op init seqs)(if (null? (car seqs))nil(cons (accumulate op init (map (lambda (x) (car x)) seqs))(accumulate-n op init (map (lambda (x) (cdr x)) seqs)))))
(define s (list (list 1 2 3)(list 4 5 6)(list 7 8 9)(list 10 11 12)))
(accumulate-n + 0 s)
(22 26 30)
点击查看代码
;矩阵的点积
(define (dot-product v w)(accumulate + 0 (map * v w)))
;求向量
(define (matrix-*-vector m v)(map (lambda (x) ( * x v)) m))
;矩阵的转置
(define (transpose mat)(accumulate-n cons nil mat))
;矩阵的乘法
(define (matrix-*-matrix m n)(let ((cols (transpose n)))(map (lambda (x) (matrix-*-vector cols x)) m)))
点击查看代码
(fold-left / 1 (list 1 2 3))
1/6
(fold-right / 1 (list 1 2 3))
3/2
(fold-left list nil (list 1 2 3))
(((() 1) 2) 3)
(fold-right list nil (list 1 2 3))
(1 (2 (3 ())))
如果要求用某个op时保证fold-right和fold-left对任何序列都产生同样结果,指出op应该满足的性质:
练习2.39 基于练习2.38的fold-right和fold-left完成reverse(练习2.18)下面的定义:
点击查看代码
;fold-right形式
(define (reverse sequence)(fold-right (lambda (x y) (append (list x) y)) nil sequence))
(reverse (list 1 2 3))
(3 2 1)
;fold-left形式
(define (reverse sequence)(fold-left (lambda (x y) (append x (list y))) nil sequence))
(reverse (list 1 2 3))
(3 2 1)