«前の日記(2008年10月22日) 最新 次の日記(2008年10月26日)» 編集

ema log


2008年10月25日 [長年日記]

_ [最近]Gauche, SICP メモ

Gauche non copy delete-1

ほんとに効率いいのか?

(define (delete-1 elt lis . options)
  (let-optionals* options ((cmp-fn equal?))
    (define (loop lis)
      (cond [(null? lis) lis]
            [(cmp-fn elt (car lis)) (cdr lis)]
            [else (let ((memo (loop (cdr lis))))
              (if (eq? (cdr lis) memo) lis (cons (car lis) memo)))]))
  (loop lis)))

(use gauche.test)
(let ((data (list 1 2 3 4 5)))
  (test* "non-copy delete-1" data (delete-1 6 data) eq?))

SICP 1.29

素直に動かすと,途中計算が有理数のため n = 10 程度で (simpson cube 0 1 10) が 1/4 を返す.

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

(define (cube x) (* x x x))
(define (inc n) (+ n 1))
(define (inc2 n) (+ n 2))

(define (simpson term a b n)
  (let ((h (/ (- b a) n)))
    (define (y k) (term (+ a (* k h))))
    (* h 1/3 (+ (y 0)
                (* 4 (sum y 1 inc2 (- n 1)))
                (* 2 (sum y 2 inc2 (- n 1)))
                (y n)))))

1.30

(> a b) のときの値に嵌った

(define (sum term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (+ result (term a)))))
  (iter a 0))

1.31

Wikipedia で式の変形をカンニング.分母に 1 * を補っている式.有理数でやると 1000 でようやく 3.147 とか.

(define (square x) (* x x))

(define (pi/4 n)
  (define (f i)
    (let ((m (* 2 i)))
      (/ (square m) (square (- m 1)))))
  (/ (* 2
        (product f 2 inc (+ n 1)))
     (- (* 2 n) 1)))

(define (pi n)
  (* 4 (exact->inexact (pi/4 n))))

1.32

(define (sum     term a next b) (accumulate + 0 term a next b))
(define (product term a next b) (accumulate * 1 term a next b))

(define (accumulate combiner null-value term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (iter (next a) (combiner result (term a)))))
  (iter a null-value))

1.33

素人くさいSICP読書会#12レポートから prime? をいただきました.

(define (filtered-accumulate combiner null-value filter term a next b)
  (define (iter a result)
    (if (> a b)
        result
        (if (filter a)
            (iter (next a) (combiner result (term a)))
            (iter (next a) result))))
  (iter a null-value))

(define (f-33-1 a b) (filtered-accumulate + 0 prime? square a inc b))