sicp-2.2.3
Posted on 2015-02-18 19:31:27 +0900 in SICP
2.33
(define (accumulate op initial sequence)
   (if (null? sequence)
       initial
       (op (car sequence)
           (accumulate op initial (cdr sequence)))))
(accumulate + 0 (list 1 2 3 4 5))
(define (map p sequence)
   (accumulate (lambda (x y) (cons (p x) y)) null sequence))
(define (square x) (* x x))
(map square '(1 2 3))
(define (append seq1 seq2)
   (accumulate cons seq2 seq1))
(append (list 1 2 3) (list 4 5 6))
(define (length sequence)
   (accumulate (lambda (x y) (+ 1 y)) 0 sequence))
(length '(1 2 3))The append is kind of tricky to me at first glance.
Just remaind me this equition: cons 1 (list 2 3) = (list 1 2 3)
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))2.35
(define (count-leaves t)
   (accumulate + 0 (map
                     (lambda (x)
                       (if (not (pair? x))
                         1
                         (count-leaves x)))
                     t)))This is the most elegant way, which flats the tree structure recursively.
2.36
(define (accumulate-n op init seqs)
   (if (null? (car seqs))
       null
       (cons (accumulate op init
                         (map (lambda (x)
                                (car x))
                              seqs))
             (accumulate-n op init
                           (map (lambda (x)
                                  (cdr x))
                                seqs)))))
(accumulate-n + 0 '((1 2 3) (4 5 6) (7 8 9) (10 11 12)))2.37
(define (dot-product v w)
   (accumulate + 0 (map * v w)))
(define (matrix-*-vector m v)
   (map (lambda (row)
          (dot-product v row)) m))
(define m0 '((1 2 3 4) (4 5 6 6) (6 7 8 9)))
(matrix-*-vector m0 '( 2 1 4 5))
(define (transpose mat)
   (accumulate-n cons null  mat))
(transpose m0)
(define (matrix-*-matrix m n)
   (let ([cols (transpose n)])
      (map (lambda(v) (matrix-*-vector cols v)) m)))
(matrix-*-matrix m0 (transpose m0))2.38
(define (fold-right op initial sequence)
   (if (null? sequence)
       initial
       (op (car sequence)
           (fold-right op initial (cdr sequence)))))
(define (fold-left op initial sequence)
   (define (iter result rest)
     (if (null? rest)
         result
         (iter (op result (car rest))
               (cdr rest))))
   (iter initial sequence))
(fold-right / 1 (list 1 2 3))
3/2
(fold-left / 1 (list 1 2 3))
1/6
(fold-right list null (list 1 2 3))
(1 (2 (3 ())))
(fold-left list null (list 1 2 3))
(((() 1) 2) 3)Both associativity and commutativity. That is
(op a b) = (op b a) and (op (op a b) c) = (op a (op b c))
2.39
(define (reverse sequence)
  (fold-right (lambda (x y)
                (append y (list x)))
              null
              sequence))
(reverse (list 1 2 3 4))
(define (reverse sequence)
  (fold-left (lambda (x y)
                (cons y  x))
              null
              sequence))
(reverse (list 1 2 3 4))2.40
(define (unique-pairs n)
  (flatmap (lambda (i)
             (map (lambda (j) (list i j))
                  (enumerate-interval 1 (- i 1))))
           (enumerate-interval 1 n)))
(define (prime-sum-pairs n)
   (map make-pair-sum
        (filter prime-sum?
                (unique-pairs n))))2.41
(define (unique-triples n)
  (flatmap (lambda (i)
             (flatmap (lambda (j)
                        (map
                          (lambda (k) (list i j k))
                          (enumerate-interval 1 (- j 1))))
                      (enumerate-interval 1 (- i 1))))
           (enumerate-interval 1 n)))
(define (equal-sum? s)
  (lambda (lst)
    (= s (accumulate + 0 lst))))2.42
(define (queens board-size)
  (define (queen-cols k)
    (if (= k 0)
        (list empty-board)
        (filter
         (lambda (positions) (safe? k positions))
         (flatmap
          (lambda (rest-of-queens)
            (map (lambda (new-row)
                   (adjoin-position new-row k rest-of-queens))
                 (enumerate-interval 1 board-size)))
          (queen-cols (- k 1))))))
  (queen-cols board-size))
(define empty-board '())
(define (adjoin-position row k rest-of-queens)
  (append rest-of-queens (list (list row k))))
(define (last l)
    (cond ((null? (cdr l)) (car l))
          (else (last (cdr l)))))
(define (safe? k positions)
  (define (attack? q1 q2)
    (and (not (= (car q1) (car q2)))
         (not (= (abs (- (car q1) (car q2)))
                 (abs (-  (cadr q1)(cadr q2)))))))
  (let ((new-queen (last positions)))
    (define (check i positions)
      (cond ((= i k) true)
            ((attack? (car positions) new-queen)
             (check (+ i 1) (cdr positions)))
            (else false)))
    (check 1 positions)))summary
The key idea to understand map, flatmap is to relate it with Category Theory.
To think about something more abstractly would help a lot in understanding
concrete concepts. Knowing HOW is the key to finish something, but WHY
is the key to master something.
Hide Comments
comments powered by Disqus