timothy235

sicp-3-5-2-infinite-streams

Mar 6th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 6.55 KB | None | 0 0
  1. #lang racket
  2. (require "sicp-3-5-streams.rkt") ; for all the book code from 3.5.1 and 3.5.2
  3.  
  4. ;;;;;;;;;;
  5. ;; 3.53 ;;
  6. ;;;;;;;;;;
  7.  
  8. (define powers
  9.   (cons-stream 1
  10.                (add-streams powers powers)))
  11.  
  12. (define (display-ten s)
  13.   (for ([i 10])
  14.     (printf "~a " (my-stream-ref s i)))
  15.   (printf "~n"))
  16.  
  17. (display-ten powers) ; should be 1 2 4 8 etc
  18. ;; 1 2 4 8 16 32 64 128 256 512
  19.  
  20. ;;;;;;;;;;
  21. ;; 3.54 ;;
  22. ;;;;;;;;;;
  23.  
  24. (define (mul-streams s1 s2)
  25.   (my-stream-map * s1 s2))
  26.  
  27. (define factorials
  28.   (cons-stream 1
  29.                (mul-streams factorials integers)))
  30.  
  31. (display-ten factorials)
  32. ;; 1 1 2 6 24 120 720 5040 40320 362880
  33.  
  34. ;;;;;;;;;;
  35. ;; 3.55 ;;
  36. ;;;;;;;;;;
  37.  
  38. (define(partial-sums s)
  39.   (cons-stream (stream-car s)
  40.                (add-streams (stream-cdr s)
  41.                             (partial-sums s))))
  42.  
  43. (display-ten (partial-sums integers))
  44. ;; 1 3 6 10 15 21 28 36 45 55
  45.  
  46. ;;;;;;;;;;
  47. ;; 3.56 ;;
  48. ;;;;;;;;;;
  49.  
  50. (define (merge s1 s2)
  51.   (cond [(stream-null? s1) s2]
  52.         [(stream-null? s2) s1]
  53.         [else
  54.           (define s1car (stream-car s1))
  55.           (define s2car (stream-car s2))
  56.           (cond [(< s1car s2car)
  57.                  (cons-stream s1car (merge (stream-cdr s1) s2))]
  58.                 [(> s1car s2car)
  59.                  (cons-stream s2car (merge s1 (stream-cdr s2)))]
  60.                 [else
  61.                   (cons-stream s1car
  62.                                (merge (stream-cdr s1)
  63.                                       (stream-cdr s2)))])]))
  64.  
  65. (define hamming
  66.   (cons-stream 1
  67.                (merge (scale-stream hamming 2)
  68.                       (merge (scale-stream hamming 3)
  69.                              (scale-stream hamming 5)))))
  70.  
  71. (display-ten hamming)
  72. ;; 1 2 3 4 5 6 8 9 10 12
  73.  
  74. ;; Let's look at the first ten >= 100.
  75.  
  76. (display-ten (my-stream-filter (lambda (x) (>= x 100)) hamming))
  77. ;; 100 108 120 125 128 135 144 150 160 162
  78.  
  79. ;;;;;;;;;;
  80. ;; 3.57 ;;
  81. ;;;;;;;;;;
  82.  
  83. (define (count-fibs n)
  84.   (define num 0)
  85.   (define (plus a b)
  86.     (set! num (add1 num))
  87.     (+ a b))
  88.   (define (count-add-streams s1 s2)
  89.     (my-stream-map plus s1 s2))
  90.   (define fib-stream
  91.     (cons-stream 0
  92.                  (cons-stream 1
  93.                               (count-add-streams (stream-cdr fib-stream)
  94.                                                  fib-stream))))
  95.   (define result (my-stream-ref fib-stream n))
  96.   (printf "~a ~a ~a ~n" n result num)
  97.   result)
  98.  
  99. ;; MEMOIZED
  100.  
  101. (for ([i 20]) (count-fibs i))
  102. ;;   n    result number of additions
  103. ;;   0    0      0
  104. ;;   1    1      0
  105. ;;   2    1      1
  106. ;;   3    2      2
  107. ;;   4    3      3
  108. ;;   5    5      4
  109. ;;   6    8      5
  110. ;;   7    13     6
  111. ;;   8    21     7
  112. ;;   9    34     8
  113. ;;   10   55     9
  114. ;;   11   89     10
  115. ;;   12   144    11
  116. ;;   13   233    12
  117. ;;   14   377    13
  118. ;;   15   610    14
  119. ;;   16   987    15
  120. ;;   17   1597   16
  121. ;;   18   2584   17
  122. ;;   19   4181   18
  123.  
  124. ;; NOT MEMOIZED
  125.  
  126. ;;   n    result number of additions
  127. ;;   0    0      0
  128. ;;   1    1      0
  129. ;;   2    1      1
  130. ;;   3    2      3
  131. ;;   4    3      7
  132. ;;   5    5      14
  133. ;;   6    8      26
  134. ;;   7    13     46
  135. ;;   8    21     79
  136. ;;   9    34     133
  137. ;;   10   55     221
  138. ;;   11   89     364
  139. ;;   12   144    596
  140. ;;   13   233    972
  141. ;;   14   377    1581
  142. ;;   15   610    2567
  143. ;;   16   987    4163
  144. ;;   17   1597   6746
  145. ;;   18   2584   10926
  146. ;;   19   4181   17690
  147.  
  148. ;; Note that the number of additions, and thus the time complexity, is almost
  149. ;; doubling each time.  That is because un-memoized recursive fibonacci is
  150. ;; O(phi ^ n) as we learned in exercise 1.31.
  151.  
  152. ;;;;;;;;;;
  153. ;; 3.58 ;;
  154. ;;;;;;;;;;
  155.  
  156. (define (expand num den radix)
  157.   (cons-stream
  158.     (quotient (* num radix) den)
  159.     (expand (remainder (* num radix) den) den radix)))
  160.  
  161. (display-ten (expand 1 7 10)) ; 1 / 7 = 0.1428571428...
  162. ;; 1 4 2 8 5 7 1 4 2 8
  163.  
  164. (display-ten (expand 3 8 10)) ; 3 / 8 = 0.375
  165. ;; 3 7 5 0 0 0 0 0 0 0
  166.  
  167. ;; Expand produces the digits in the base radix expansion of num / den.
  168.  
  169. ;;;;;;;;;;
  170. ;; 3.59 ;;
  171. ;;;;;;;;;;
  172.  
  173. (define (integrate-series s)
  174.   (my-stream-map / s integers))
  175.  
  176. (define exp-series
  177.   (cons-stream 1 (integrate-series exp-series)))
  178.  
  179. (display-ten exp-series) ; should be 1 / n!
  180. ;; 1 1 1/2 1/6 1/24 1/120 1/720 1/5040 1/40320 1/362880
  181.  
  182. (define cosine-series ; derivative of cosine is -1 * sine
  183.   (cons-stream 1 (scale-stream
  184.                    (integrate-series sine-series)
  185.                    -1)))
  186.  
  187. (define sine-series ; derivative of sine is cosine
  188.   (cons-stream 0 (integrate-series cosine-series)))
  189.  
  190. (display-ten cosine-series) ; 2 * n term should be (-1) ^ n / (2 * n)!
  191. ;; 1 0 -1/2 0 1/24 0 -1/720 0 1/40320 0
  192.  
  193. (display-ten sine-series) ; 2 * n + 1 term should be (-1) ^ n / (2 * n + 1)!
  194. ;; 0 1 0 -1/6 0 1/120 0 -1/5040 0 1/362880
  195.  
  196. ;;;;;;;;;;
  197. ;; 3.60 ;;
  198. ;;;;;;;;;;
  199.  
  200. (define (mul-series s1 s2)
  201.   (cons-stream (* (stream-car s1)
  202.                   (stream-car s2))
  203.                (add-streams (scale-stream (stream-cdr s2) (stream-car s1))
  204.                             (mul-series s2 (stream-cdr s1)))))
  205.  
  206. ;; The idea is:
  207. ;; (a0 + a1 * x + a2 * x ^ 2 + ...) * (b0 + b1 * x + b2 * x ^ 2 + ...)
  208. ;; = a0 * (b0 + b1 * x + b2 * x ^ 2 + ...)
  209. ;; + (a1 * x + a2 * x ^ 2 + ...) * (b0 + b1 * x + b2 * x ^ 2 + ...)
  210.  
  211. (display-ten (add-streams (mul-series cosine-series cosine-series)
  212.                           (mul-series sine-series sine-series)))
  213. ;; 1 0 0 0 0 0 0 0 0 0
  214.  
  215. (display-ten (mul-series integers integers)) ; should be 1 4 10 20 35 etc
  216. ;; 1 4 10 20 35 56 84 120 165 220
  217.  
  218. ;;;;;;;;;;
  219. ;; 3.61 ;;
  220. ;;;;;;;;;;
  221.  
  222. (define (invert-unit-series s)
  223.   (unless (= (stream-car s) 1)
  224.     (error "Constant term must be 1 -- INVERT-UNIT-SERIES" s))
  225.   (cons-stream 1
  226.                (scale-stream (mul-series (stream-cdr s)
  227.                                          (invert-unit-series s))
  228.                              -1)))
  229.  
  230. (display-ten (invert-unit-series ones))
  231. ;; 1 -1 0 0 0 0 0 0 0 0
  232.  
  233. ;; This says that the sum of the geometric series 1 + x + x ^ 2 + x ^ 3 + ...
  234. ;; = 1 / (1 - x) but expressed with inverses.
  235.  
  236. ;;;;;;;;;;
  237. ;; 3.62 ;;
  238. ;;;;;;;;;;
  239.  
  240. (define (div-series s1 s2)
  241.   (when (zero? (stream-car s2))
  242.     (error "Constant term of second series must be non-zero -- DIV-SERIES" s2))
  243.   (scale-stream
  244.     (mul-series s1
  245.                 (invert-unit-series (scale-stream s2
  246.                                                   (/ 1 (stream-car s2)))))
  247.     (stream-car s2)))
  248.  
  249. (define tangent-series (div-series sine-series cosine-series))
  250.  
  251. (display-ten tangent-series) ; should be 0 1 0 1/3 0 2/15 0 17/315 etc
  252. ;; 0 1 0 1/3 0 2/15 0 17/315 0 62/2835
Add Comment
Please, Sign In to add comment