Middle Earth

sicp-exercise-1.44-1.46

Exercise 1.44


(define (average a b c) ;there should be a general way to get average
(/ (+ a b c) 3.0))

(define (smooth f)
(lambda (x)
(average (f x)
(f (- x 0.5))
(f (+ x 0.5)))))

(define (n-fold-smooth f n)
(repeated (smooth f) n))
I need to check my answer through some examples, will find some later.

Exercise 1.45

(define (nth-root x n damp-times)
(find-fixed-points ((repeated average-damp (damp-times n))
(lambda (y) (/ x (fast-expt y (- n 1)))))
1.0))

damp time should be n/2
(define (half n) (/ n 2))
But how to cast n to integer, in case I receive a float number?

And yet, it doesn’t work that well:
;1 ]=> (nth-root 32 5 half)
;Aborting!: out of memory


Exercise 1.46

iterative-improve return a procedure built from its two parameters good-enough? and improve-guess. The returned procedure iteratively improves the guess until good enough.

(define (iterative-improve good-enough? improve-guess)
(define (get-guess guess)
(if (good-enough? guess)
guess
(get-guess (improve-guess guess))))
get-guess)


(define (iter-improve-sqrt x)
((iterative-improve (lambda (guess)
(< (abs (- (square guess) x))
0.01))
(average-damp (lambda (y) (/ x y))))
1.0))

(define (close-enough? v1 v2)
(< (abs (- v1 v2)) 0.00001))

(define (iter-improve-fixed-point f first-guess)
((iterative-improve (lambda (guess) (close-enough? guess (f guess)))
(lambda (guess) (f guess)))
first-guess))

Comments