SICP問題1.46
こんな感じ?
(define (iterative-improve f) (define (enough? a b) (< (abs (- a b)) 0.001)) (define (iter guess x) (if (enough? guess x) guess (iter (f guess x) x))) (lambda (y) (iter 1.0 y))) (define (sqrt z) ((iterative-improve (lambda (x y) (average y (/ x y)))) z))
と思ったら、うまくいかない orz
どうやら、問題の意味を取り違えているみたい。
- 予測値が十分良好であるか調べる方法
- 予測値を改良する方法
を引数にとって、
- 引数として予測値をとり、予測値が十分良好になるまで改良を繰り返す手続きを返す
という感じでヨサゲ。
書き直し。
(define (iterative-improve enough? improve) (lambda (guess) (define (iter guess) (if (enough? guess) guess (iter (improve guess)))) (iter guess))) (define (sqrt x) (define (enough? guess) (< (abs (- (square guess) x)) 0.00001)) (define (improve guess) (average guess (/ x guess))) ((iterative-improve enough? improve) 1.0)) (define (fixed-point f first-guess) (define (enough? guess) (< (abs (- guess (f guess))) 0.00001)) ; (define (improve guess) ; (f guess)) ((iterative-improve enough? f) first-guess) ;) )
テスト
(fixed-point (lambda (y) (average y (/ 2 y))) 1.0) ; 1.4142156862745097 (sqrt 2) ; 1.4142156862745097