1.46¶
; Several of the numerical methods described in this chapter ; are instances of an extremely general computational strategy ; known as iterative improvement. Iterative improvement says ; that, to compute something, we start with an initial guess ; for the answer, test if the guess is good enough, and otherwise ; improve the guess and continue the process using the improved ; guess as the new guess. Write a procedure iterative-improve ; that takes two procedures as arguments: a method for telling ; whether a guess is good enough and a method for improving a ; guess. iterative-improve should return as its value a procedure ; that takes a guess as argument and keeps improving the guess ; until it is good enough. Rewrite the sqrt procedure of Section 1.1.7 ; and the fixed-point procedure of Section 1.3.3 in terms of ; iterative-improve. (define (iterative-improve good-enough? improve) (lambda (guess) (if (good-enough? guess) guess ((iterative-improve good-enough? improve) (improve guess))))) ; (i) Re-write sqrt (define (sqrt-iter x) (define (avg a b) (/ (+ a b) 2)) (define (good-enough? guess) (< (abs (- (square guess) x)) 0.001)) (define (improve guess) (avg guess (/ x guess))) ((iterative-improve good-enough? improve) 1.0)) (sqrt-iter 69) ;Value: 8.306626993523448 ; (ii) Re-write `fixed-point` (define (fixed-point f first-guess) (define (close-enough? v1 v2) (< (abs (- v1 v2)) 0.00001)) ((iterative-improve (lambda (x) (close-enough? x (f x))) f) first-guess)) (fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0) ;Value: 1.6180327868852458 (~= φ, golden ratio)