問題2.37 – SICP(計算機プログラムの構造と解釈)その51

問題2.37

accumulate 手続きと accumulate-n 手続き

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))


(define (accumulate-n op init seqs)
  (if (null? (car seqs))
      ()
      (cons (accumulate op init (map car seqs))
            (accumulate-n op init (map cdr seqs)))))

総和 dot-product

(define (dot-product v w)
  (accumulate + 0 (map * v w)))

(dot-product (list 1 2 3) (list 4 5 6))
gosh> 32

マトリックス * ベクタ matrix-*-vector

(define (matrix-*-vector m v)
  (map (lambda (x) (dot-product v x)) m))

(matrix-*-vector '((2 -1) (-3 4)) '(1 2))
gosh> (0 5)

転置行列(transposed matrix) transpose

(define (transpose mat)
  (accumulate-n cons () mat))

(transpose '((1 2 3) (4 5 6) (7 8 9)))
gosh> ((1 4 7) (2 5 8) (3 6 9))

マトリックス * マトリックス matrix-*-matrix

(define (matrix-*-matrix m n)
  (let ((cols (transpose n)))
       (map (lambda (x) (matrix-*-vector cols x)) m)))

(matrix-*-matrix '((1 -1) (-2 3)) '((1 2) (3 4)))
gosh> ((-2 -2) (7 8))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»