exercise-2.34-horner's-rule.rkt 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #lang racket
  2. (require rackunit)
  3. (define (Mb-to-B n) (* n 1024 1024))
  4. (define MAX-BYTES (Mb-to-B 64))
  5. (define nil '())
  6. (custodian-limit-memory (current-custodian) MAX-BYTES)
  7. ; racket -l errortrace -t exercise-...
  8. ;; PREDEFINED CODE
  9. (define (filter predicate sequence)
  10. (cond
  11. [(null? sequence)
  12. nil]
  13. [(predicate (car sequence))
  14. (cons (car sequence) (filter predicate (cdr sequence)))]
  15. [else
  16. (filter predicate (cdr sequence))]))
  17. (define (accumulate op initial sequence)
  18. (if
  19. (empty? sequence)
  20. initial
  21. (op
  22. (car sequence)
  23. (accumulate op initial (cdr sequence)))))
  24. (define (enumerate-interval low high)
  25. (if
  26. (> low high)
  27. nil
  28. (cons
  29. low
  30. (enumerate-interval (+ low 1) high))))
  31. (define (enumerate-tree tree)
  32. (cond
  33. [(empty? tree) nil]
  34. [(not (pair? tree)) (list tree)]
  35. [else (append
  36. (enumerate-tree (car tree))
  37. (enumerate-tree (cdr tree)))]))
  38. ;; EXERCISE 2.34
  39. ; - implementation of Horner's rule
  40. (define (horner-eval x coefficient-sequence)
  41. (accumulate
  42. (lambda (this-coeff higher-terms)
  43. (+ (* higher-terms x) this-coeff))
  44. 0
  45. coefficient-sequence))
  46. ;; UNIT TESTS
  47. (define (check-equal?-with-output a b failure-msg)
  48. (display "checking for equality:") (newline)
  49. (display a) (newline)
  50. (display b) (newline)
  51. (check-equal? a b failure-msg))
  52. (define (run-test-newlines a-test-suite)
  53. (for-each
  54. (λ (elem)
  55. (display elem) (newline))
  56. (run-test a-test-suite)))
  57. (define exercise-test
  58. (test-suite
  59. "exercise test"
  60. #:before (λ () (display "before") (newline))
  61. #:after (λ () (display "after") (newline))
  62. (test-case
  63. "test case for horner-eval"
  64. (check-equal?
  65. (horner-eval 2 (list 1 3 0 5 0 1))
  66. 79
  67. "horner-eval does not work correctly"))
  68. ))
  69. (run-test exercise-test)