exercise-1.46-iterative-improvement.rkt 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #lang racket
  2. (define (Mb-to-B n) (* n 1024 1024))
  3. (define MAX-BYTES (Mb-to-B 64))
  4. (custodian-limit-memory (current-custodian) MAX-BYTES)
  5. (define (close-enough? a b)
  6. (define tolerance 1.e-8)
  7. (< (abs (- a b)) tolerance))
  8. (define (average a b)
  9. (/ (+ a b) 2))
  10. (define (average-damp f)
  11. (lambda (x) (average x (f x))))
  12. (define (iterative-improve guess-good-enough? improve)
  13. (lambda (x)
  14. (let
  15. ((improved-x (improve x)))
  16. (if
  17. (guess-good-enough? x improved-x)
  18. ; if the guess is good enough, we return the guess
  19. improved-x
  20. ; if the improved guess is not good enough yet, we do another iteration
  21. ((iterative-improve guess-good-enough? improve) improved-x)))))
  22. ; exercise 1.46.a
  23. (define (sqrt-iter-improve n)
  24. ((iterative-improve
  25. close-enough?
  26. (lambda (guess)
  27. (average guess (/ n guess))))
  28. 1.0))
  29. (sqrt-iter-improve 9)
  30. ; exercise 1.46.b
  31. (define (fixed-point f guess)
  32. ((iterative-improve
  33. close-enough?
  34. ; fixed point search of a function is an example of iterative improvement
  35. ; we apply f over and over again on the result of the previous function application
  36. ; in order to get to make the (function of) results converge
  37. ; since iterative improvement does exactly that, we only need to give f as a parameter
  38. f)
  39. guess))
  40. (define (sqrt-fp-iter-improve x)
  41. (define (improve x)
  42. (average-damp (lambda (y) (/ x y))))
  43. ((iterative-improve
  44. close-enough?
  45. ; here we must apply improve instead of only giving the function's name as a parameter,
  46. ; because the lambda inside the improve function must already be average damped,
  47. ; when it is used in the iterative improvement function
  48. (improve x))
  49. 1.0))
  50. (sqrt-fp-iter-improve 9)