理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

問題1-46

反復改良法(iterative improvement)を抽象化したのがこちら。

(define (iterative-improve good-enough? improve expectancy)
  (if (good-enough? expectancy)
      expectancy
      (iterative-improve good-enough? improve (improve expectancy))))

これを使って、平方根を求める関数と、不動点を求める関数を作り直せとか言われた。
平方根はこれでいいっぽい。

(define (average x y)
  (/ (+ x y) 2))

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

(define (sqrt x)
  (define tolerance 0.0001)
  (define (good-enough? guess)
    (< (abs (- (square guess) x)) tolerance))
  (define (improve guess)
    (average guess (/ x guess)))
  (iterative-improve good-enough? improve 1.0))

実験。

gosh> (sqrt 2)
1.4142156862745097

つぎ、不動点探索。

(define (fixed-point f guess)
  (define tolerance 0.00001)
  (define (close-enough? v1)
    (< (abs (- v1 (f v1))) tolerance))
  (define (next guess) (f guess))
  (iterative-improve close-enough? next 1.0))

これ使って、またsqrtもとめてみるお。

gosh> (define (fixed-sqrt x)
  (fixed-point (lambda (y) (average y (/ x y))) 1.0))

fixed-sqrt
gosh> (fixed-sqrt 2)
1.4142156862745097

この問題とくとき、平均緩和忘れててハマったのは秘密。