Exercise 1.40 Define a procedure
cubic
to approximate zeros of the cubic x3 + ax2 + bx + c.(define (cube x) (* x x x)) (define (cubic a b c) (lambda (x) (+ (cube x) (* a (square x)) (* b x) c)))
Exercise 1.41 Define a procedure
double
that takes a procedure of one argument as argument and returns a procedure that applies the original procedure twice.(define (double f) (lambda (x) (f (f x)))) ((double square) 2) ;Value: 16 (((double (double double)) inc) 5) ;Value: 21
Exercise 1.42 Define a procedure
compose
that implements composition.(define (compose f g) (lambda (x) (f (g x)))) ((compose square inc) 6) ;Value: 49
Exercise 1.43 Write a procedure that takes as inputs a procedure that computes f and a positive integer n and returns the procedure that computes the nth repeated application of f.
(define (repeated f x) (lambda (y) (if (= x 1) (f y) ((compose f (repeated f (- x 1))) y)))) ((repeated square 2) 5) ;Value: 625
Exercise 1.44 Write a procedure smooth that takes as input a procedure that computes f and returns a procedure that computes the smoothed f.
(define (smooth f) (lambda (x) (let ((dx .00001)) (/ (+ (f (+ x dx)) (f x) (f (- x dx))) 3.0)))) (sqrt 4) ;Value: 2.0000000944796694 (((repeated smooth 10) sqrt) 4) ;Value: 2.0000000944692538
I'm not sure whether
sqrt
doesn't respond to smoothing, the dx
is too large, or this solution isn't right. But I think it's right.