Blame


1 665c255d 2023-08-04 jrmu (defun iterative-improve (good-enough? improve)
2 665c255d 2023-08-04 jrmu (lambda (first-guess)
3 665c255d 2023-08-04 jrmu (labels ((improve-iter (guess)
4 665c255d 2023-08-04 jrmu (let ((improved-guess (funcall improve guess)))
5 665c255d 2023-08-04 jrmu (if (funcall good-enough? guess improved-guess)
6 665c255d 2023-08-04 jrmu improved-guess
7 665c255d 2023-08-04 jrmu (improve-iter improved-guess)))))
8 665c255d 2023-08-04 jrmu (improve-iter first-guess))))
9 665c255d 2023-08-04 jrmu (defun improved-sqrt (num)
10 665c255d 2023-08-04 jrmu (funcall (iterative-improve
11 665c255d 2023-08-04 jrmu (lambda (x y)
12 665c255d 2023-08-04 jrmu (let ((ratio (/ x y)))
13 665c255d 2023-08-04 jrmu (and (< ratio 1.001) (> ratio 0.999))))
14 665c255d 2023-08-04 jrmu (lambda (guess)
15 665c255d 2023-08-04 jrmu (average guess (/ num guess))))
16 665c255d 2023-08-04 jrmu 1.0))
17 665c255d 2023-08-04 jrmu (defvar *tolerance* 0.00001)
18 665c255d 2023-08-04 jrmu (defun improved-fixed-point (f first-guess)
19 665c255d 2023-08-04 jrmu (funcall (iterative-improve
20 665c255d 2023-08-04 jrmu (lambda (x y)
21 665c255d 2023-08-04 jrmu (< (abs (- x y)) *tolerance*))
22 665c255d 2023-08-04 jrmu (lambda (guess)
23 665c255d 2023-08-04 jrmu (funcall f guess)))
24 665c255d 2023-08-04 jrmu first-guess))
25 665c255d 2023-08-04 jrmu