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