予習

出発準備完了なのかどうか。今日の予定になってるナニを予習。
まず、関数の不動点をナニする手続きが以下。

(define tolerance 0.00001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (let ((next (f guess)))
      (if (close-enough? guess next)
	  next
	  (try next))))
  (try first-guess))

これは 1.3.3 節で出てくるものです。で、average-damp という手続きが 1.3.4 で出てくる。

(define (average-damp f)
  (lambda (x) (average x (f x))))

ちなみに 1.3.3 の平方根の手続きな例が以下。

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

1.3.4 で出てくるナニが以下。

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

これって展開すると以下だな。

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

これと、1.1.7 の平方根の手続きを比べてみる。

(define (sqrt x)
  (sqrt-iter 1.0 x))
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (ssqrt-iter (improve guess x) x)))
(define (improve guess x)
  (average guess (/ x guess)))
(define (average x y)
  (/ (+ x y) 2))
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

同じ方法使ってますな。しかも 1.3.4 の方が定義は簡潔明瞭な事が分かります。今回は 1.41、1.42、1.43 あたりはお手伝いできそげですが、彼的には簡単なのに違いない。