sequence-operations.rkt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. ; existing code from previous exercises
  9. (define (odd? num)
  10. (= (remainder num 2) 1))
  11. (define (even? num)
  12. (= (remainder num 2) 0))
  13. (define (square x) (* x x))
  14. (define (fib n)
  15. (define (fib-iter a b p q count)
  16. (cond
  17. ((= count 0) b)
  18. ((even? count) (fib-iter
  19. a
  20. b
  21. (+ (* p p) (* q q))
  22. (+ (* 2 p q) (* q q))
  23. (/ count 2)))
  24. (else (fib-iter
  25. (+ (* b q) (* a q) (* a p))
  26. (+ (* b p) (* a q))
  27. p
  28. q
  29. (- count 1)))))
  30. (fib-iter 1 0 0 1 n))
  31. ; new code
  32. (define (filter predicate sequence)
  33. (cond
  34. [(null? sequence)
  35. nil]
  36. [(predicate (car sequence))
  37. (cons (car sequence) (filter predicate (cdr sequence)))]
  38. [else
  39. (filter predicate (cdr sequence))]))
  40. (define (accumulate op initial sequence)
  41. (if
  42. (empty? sequence)
  43. initial
  44. (op
  45. (car sequence)
  46. (accumulate op initial (cdr sequence)))))
  47. (define (enumerate-interval low high)
  48. (if
  49. (> low high)
  50. nil
  51. (cons
  52. low
  53. (enumerate-interval (+ low 1) high))))
  54. (define (enumerate-tree tree)
  55. (cond
  56. [(empty? tree) nil]
  57. [(not (pair? tree)) (list tree)]
  58. [else (append
  59. (enumerate-tree (car tree))
  60. (enumerate-tree (cdr tree)))]))
  61. ; now we are ready to use these procedures
  62. (define (sum-odd-squares tree)
  63. (accumulate
  64. +
  65. 0
  66. (map
  67. square
  68. (filter
  69. odd?
  70. (enumerate-tree tree)))))
  71. (define (even-fibs maximum)
  72. (accumulate
  73. cons
  74. nil
  75. (filter
  76. even?
  77. (map fib (enumerate-interval 0 maximum)))))
  78. (define (list-fib-squares maximum)
  79. (accumulate
  80. cons
  81. nil
  82. (map
  83. square
  84. (map
  85. fib
  86. (enumerate-interval 0 maximum)))))
  87. (define (prod-of-squares-of-odd-elems sequence)
  88. (accumulate * 1 (map square (filter odd? sequence))))
  89. ;; UNIT TESTS
  90. (define (check-equal?-with-output a b failure-msg)
  91. (display "checking for equality:") (newline)
  92. (display a) (newline)
  93. (display b) (newline)
  94. (check-equal? a b failure-msg))
  95. (define (run-test-newlines a-test-suite)
  96. (for-each
  97. (λ (elem)
  98. (display elem) (newline))
  99. (run-test a-test-suite)))
  100. (define exercise-test
  101. (test-suite
  102. "exercise test"
  103. #:before (λ () (display "before") (newline))
  104. #:after (λ () (display "after") (newline))
  105. (test-case
  106. "does filter work correctly?"
  107. (check-equal?
  108. (filter odd? (list 1 2 3 4 5 6 7))
  109. (list 1 3 5 7)
  110. "filter does not work correctly")
  111. (check-equal?
  112. (filter even? (list 1 2 3 4 5 6 7))
  113. (list 2 4 6)
  114. "filter does not work correctly"))
  115. (test-case
  116. "does accumulate work correctly?"
  117. (check-equal?
  118. (accumulate + 0 (list 1 2 3 4 5 6 7 8 9 10))
  119. 55
  120. "accumulate does not work correctly")
  121. (check-equal?
  122. (accumulate * 1 (list 1 2 3 4 5))
  123. 120
  124. "accumulate does not work correctly"))
  125. (test-case
  126. "does enumerate-interval work correctly?"
  127. (check-equal?
  128. (enumerate-interval 1 10)
  129. (list 1 2 3 4 5 6 7 8 9 10)
  130. "enumerate-interval does not work correctly")
  131. (check-equal?
  132. (enumerate-interval -10 1)
  133. (list -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1)
  134. "enumerate-interval does not work correctly"))
  135. (test-case
  136. "does enumerate-tree work correctly?"
  137. (check-equal?
  138. (enumerate-tree (list (list 4 3) (list (list 1 2) 5 (list 10 7))))
  139. (list 4 3 1 2 5 10 7)
  140. "enumerate-tree does not work correctly"))
  141. (test-case
  142. "does even-fibs only return even fibonacci numbers?"
  143. (check-equal?
  144. (even-fibs 12)
  145. (list 0 2 8 34 144)
  146. "even-fibs does not only return even fibonacci numbers"))
  147. (test-case
  148. "test case for list-fib-squares"
  149. (check-equal?
  150. (list-fib-squares 5)
  151. (list 0 1 1 4 9 25)
  152. "list-fib-squares does not work correctly"))
  153. (test-case
  154. "test case for prod-of-squares-of-odd-elems"
  155. (check-equal?
  156. (prod-of-squares-of-odd-elems (list 1 3 2 5 6 9 10 11))
  157. (* (* 1 1) (* 3 3) (* 5 5) (* 9 9) (* 11 11))
  158. "prod-of-squares-of-odd-elems does not work correctly"))
  159. ))
  160. (time (run-test-newlines exercise-test))