反復改良法(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
この問題とくとき、平均緩和忘れててハマったのは秘密。