(define (pow x y)
(define (pow-iter x y p)
(if (<= y 0)
p
(pow-iter x (- y 1) (* p x))))
(pow-iter x y 1))
(define (avarage x y) (/ (+ x y) 2.0))
(define (fixed-point f first-guess)
(define tolerance 0.0000000001)
(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))
(define (square-root x)
(fixed-point (lambda (y) (avarage y (/ x y)))
1.0))
(define (cube-root x)
(fixed-point (lambda (y) (avarage y (/ x (pow y 2))))
1.0))
(define (4-root x)
(fixed-point (lambda (y) (avarage y (avarage y (/ x (pow y 3)))))
1.0))
(define (5-root x)
(fixed-point (lambda (y) (avarage y (avarage y (/ x (pow y 4)))))
1.0))
(define (6-root x)
(fixed-point (lambda (y) (avarage y (avarage y (/ x (pow y 5)))))
1.0))
(define (7-root x)
(fixed-point (lambda (y) (avarage y (avarage y (/ x (pow y 6)))))
1.0))
(define (8-root x)
(fixed-point (lambda (y) (avarage y (avarage y (avarage y (/ x (pow y 7))))))
1.0))
(define (avarage-req-num n)
(define (avarage-req-num-iter y)
(if (< n (pow 2 y))
y
(avarage-req-num-iter (+ y 1))))
(- (avarage-req-num-iter 2) 1))
(define (compose f g)
(lambda (x) (f (g x))))
(define (repeated f n)
(define (repeated-iter f n p)
(if (<= n 0)
p
(repeated-iter f (- n 1) (compose p f))))
(repeated-iter f n (lambda (x) x)))
(define (n-root x n)
(fixed-point (lambda (y)
(define (avarage-y z) (/ (+ z y) 2.0))
((repeated avarage-y (avarage-req-num n)) (/ x (pow y (- n 1)))))
1.0))
(define (iterative-improve f g)
(lambda (first-guess)
(define (try guess)
(let ((next (g guess)))
(if (f guess next)
next
(try next))))
(try first-guess)))
(define (fixed-point f first-guess)
((iterative-improve
(lambda (v1 v2) (< (abs (- v1 v2)) 0.0000000001))
f)
first-guess))
(define (avarage x y) (/ (+ x y) 2))
(define (sqrt x)
(fixed-point (lambda (y) (avarage y (/ x y)))
1.0))