将fixed-point直接改写为题目要求的过程,然后按照1.17的sqrt改造过程,结合fixed-point改造一个带平均阻尼的sqrt-damp过程。
#lang racket
(define (iterative-improve improve good-enough?)
(define (try guess)
(let ((next (improve guess)))
(if (good-enough? guess next)
next
(try next))))
try)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) 0.00001))
(define (fixed-point f first-guess)
((iterative-improve f close-enough?) first-guess))
(define (average x y) (/ (+ x y) 2))
(define (square x) (* x x))
(define (sqrt x)
(define (sqrt-improve guess)
(average guess (/ x guess)))
(define (good-enough? guess guess-next)
(< (abs (- (square guess) x)) 0.001))
((iterative-improve sqrt-improve good-enough?) 1.0))
(define (average-damp f)
(lambda (x) (average x (f x))))
(define (sqrt-damp x)
(fixed-point (average-damp (lambda (y) (/ x y))) 1.0))
(sqrt 2)
(sqrt 3)
(sqrt 4)
(sqrt-damp 2)
(sqrt-damp 3)
(sqrt-damp 4)
运行结果
1.4142135623746899
1.7320508100147274
2.000000000000002
1.4142135623746899
1.7320508075688772
2.000000000000002