Skip to content

1.45

; We saw in Section 1.3.3 that attempting to compute square 
; roots by naively finding a fixed point of y 􏰕→ x/y does not 
; converge, and that this can be fixed by average damping. 
; The same method works for finding cube roots as fixed 
; points of the average-damped y 􏰕→ x/y2. Unfortunately, the 
; process does not work for fourth roots — a single average 
; damp is not enough to make a fixed-point search for y 􏰕→ x/y3 
; converge. On the other hand, if we average damp twice (i.e., 
; use the average damp of the average damp of y 􏰕→ x/y3) the 
; fixed-point search does converge. Do some experiments to 
; determine how many average damps are required to compute 
; nth roots as a fixed-point search based upon repeated average 
; damping of y 􏰕→ x/yn−1. Use this to implement a simple procedure 
; for computing nth roots using fixed-point, average-damp, and 
; the repeated procedure of Exercise 1.43. Assume that any 
; arithmetic operations you need are available as primitives.

(define (average-damp f)
    (lambda (x) ((lambda (a b) (/ (+ a b) 2)) x (f x))))
(define (fixed-point f first-guess)
    (define (close-enough? v1 v2)
        (< (abs (- v1 v2)) 0.00001))
    (define (try guess)
        (let ((next (f guess)))
            (if (close-enough? guess next)
                next
                (try next))))
    (try first-guess))
(define (compose f g)
    (lambda (x) (f (g x))))
(define (repeated f n)
    (if (= n 1) (lambda (x) (f x))
        (compose f (repeated f (- n 1))))
)

; Let's write nth-root procedure
(define (nth-root x n damps)
    (fixed-point 
        ((repeated average-damp damps)
            (lambda (y) (/ x (expt y (- n 1)))))
        1.0))

; Let's try with some values
(nth-root 1296 4 3) ;Value: 6.000005021306138 (6^4 = 1296)
(nth-root 2197.5 5 3) ;Value: 4.660003848858503 (4.66^5 ~= 2197.5)

; It is sufficient to apply number of damps log2(n) times
(define (nth-root x n)
    (define damps (floor (/ (log n) (log 2))))
    (fixed-point 
        ((repeated average-damp damps)
            (lambda (y) (/ x (expt y (- n 1)))))
        1.0))

(nth-root 1048576 20) ;Value: 1.999999063225966