sicp ch3 5 - andstudy/forge GitHub Wiki

3.5 ์ŠคํŠธ๋ฆผ

3.1 ~ 4 ์žฅ์˜ ๋‚ด์šฉ

  • ๊ณ„์‚ฐ ๋ฌผ์ฒด ์†์— ๋ณ€์ˆ˜๋ฅผ ์ˆจ๊ฒจ์„œ ์ƒํƒœ๊ฐ€ ์žˆ๋Š” ์ง„์งœ ๋ฌผ์ฒด๋ฅผ ํ‰๋‚ด๋‚ด๊ณ ,
  • ์ปดํ“จํ„ฐ์˜ ๊ณ„์‚ฐ ์‹œ๊ฐ„์œผ๋กœ ์ง„์งœ ์‹œ๊ฐ„์˜ ๋ณ€ํ™”๋ฅผ ๋‚˜ํƒ€๋ƒˆ๋‹ค
  • ๊ณ„์‚ฐ ๋ฌผ์ฒด์˜ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ฌผ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ํ‘œํ˜„

3.5 ์žฅ์€?

  • ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ : ๋ฎ์–ด์“ฐ๊ธฐ(assignment) ๋•Œ๋ฌธ์— ์ƒ๊ฒจ๋‚˜๋Š” ๋ณต์žกํ•œ ๋ฌธ์ œ๋“ค์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์‹œ๊ฐ„ ํ•จ์ˆ˜๋ฅผ ํ‰๋‚ด๋‚ด๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆผ์ด๋ผ๋Š” ์ฐจ๋ก€์—ด์˜ ํ•œ ํ˜•ํƒœ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ์˜ ๋ณ€ํ™”๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์…ˆ๋ฏธ๋ฃธ ๊ณ„์‚ฐ๋ฒ•(delayed evaluation) : ์ŠคํŠธ๋ฆผ์„ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ๋ชจ๋“  ํ‘œํ˜„๋ ฅ์„ ์ œ๋Œ€๋กœ ๋‹ด์•„๋‚ด์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์ž…ํ•œ ๋ฐฉ๋ฒ•. ์•„์ฃผ ํฐ ์ฐจ๋ก€์—ด, ๋์—†๋Š” ์ฐจ๋ก€์—ด๋„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

3.5.1 ์ŠคํŠธ๋ง๊ณผ (๊ณ„์‚ฐ์„) ๋ฏธ๋ฃฌ ๋ฆฌ์ŠคํŠธ

๋˜์ƒˆ๊น€์งˆ

์ฐจ๋ก€์—ด ์—ฐ์‚ฐ์˜ ํ•œ๊ณ„

  • ''' ๊ตฌ๊ฐ„์˜ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ '''

      ;; ๋˜ํ’€์ด ๋ฐฉ์‹
      (define (sum-primes a b)
        (define (iter count accum)
          (cond ((> count b) accum)
      	  ((prime? count) (iter (+ count 1) (+ count accum)))
      	  (else (iter (+ count 1) accum))))
        (iter a 0))
      
      ;; ์ฐจ๋ก€์—ด ์—ฐ์‚ฐ ๋ฐฉ์‹
      (define (sum-primes a b)
        (accumulate +
      	      0
      	      (filter prime? (enumerate-interval a b))))
    
  • ์ฐจ๋ก€์—ด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฆฌ์ŠคํŠธ์˜ ๋ณ€ํ™˜ ๊ณผ์ •์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ณต์‚ฌํ•ด์•ผ ํ•จ

    • vs ๋”ํ•œ ๊ฐ’์„ ๋„ฃ์–ด๋‘˜ ์ž๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.
      • ๋‹จ๊ณ„๋ณ„ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ์ „์— ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ชปํ•จ
    • vs ๊ตฌ๊ฐ„ ์†์˜ ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ฉด์„œ ๊ณง๋ฐ”๋กœ ์†Œ์ˆ˜ ๊ฒ€์‚ฌ์™€ ๋”ํ•˜๊ธฐ ์ˆ˜ํ–‰
    • -> ์ด๊ฑด ์–ด์ฉ”๊ฑด๋ฐ?
  • '''10000rhk 1000000 ์‚ฌ์ด์— ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ์†Œ์ˆ˜ ์ฐพ๊ธฐ'''

      (car (cdr (filter prime?
      		  (enumerate-interval 10000 1000000))))
    
  • ์“ธ๋ฐ์—†๋Š” ๊ณ„์‚ฐ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค. 100๋งŒ ๊ฐœ ๊ฐ€๊นŒ์šด ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ์“ธ๋ชจ ์—†์Œ

  • vs ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ๋”ฐ์ ธ๋ณด๊ณ  ๋‘ ๋ฒˆ์งธ ์†Œ์ˆ˜์—์„œ ๊ณง๋ฐ”๋กœ ๊ณ„์‚ฐ์„ ๋๋ƒ„

์ŠคํŠธ๋ฆผ

  • ์ฐจ๋ก€์—ด ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์กฐ๊ธˆ์”ฉ ํ•„์š”ํ•œ ๋งŒํผ ๊ณ„์‚ฐ์„ ์ฒ˜๋ฆฌํ•ด ๋‚˜๊ฐ€๋Š” ํšจ์œจ์„ฑ๊นŒ์ง€ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ”ํƒ•์ด ๋˜๋Š” ์•„์ด๋””์–ด : ์ŠคํŠธ๋ฆผ์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ, ์ŠคํŠธ๋ฆผ์„ "๋œ ๋งŒ๋“ " ์ƒํƒœ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด ๋‹ค์Œ, ์ŠคํŠธ๋ฆผ์„ ์“ฐ๋Š” ์ชฝ์—์„œ ์•„์ง ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ์ŠคํŠธ๋ฆผ์˜ ์ผ๋ถ€๋ฅผ ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ, ์ŠคํŠธ๋ฆผ ์ž์ฒด๊ฐ€ ๋”ฑ ์“ธ ๋งŒํผ๋งŒ ์•Œ์•„์„œ ์›์†Œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ฒŒ๋” ํ•˜์ž.

  • ์ŠคํŠธ๋ฆผ ๊ตฌํ˜„ e1

      (car (cons 1 2))
      (cdr (cons 1 2))
      (stream-car (cons-stream 'x 'y))
      (stream-cdr (cons-stream 'x 'y))
      
      (cons-stream <a> <b>) ==> (cons <a> (delay <b>))
      
      (delay <exp>) ==> (lambda () <exp>)
      
      (define (force delayed-object)
        (delayed-object))
    
  • delay : special form. (delay )๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ์˜ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์…ˆ๋ฏธ๋ฃฌ ๋ฌผ์ฒด(delayed object)๊ฐ€ ๋‚˜์˜จ๋‹ค. ์–ธ์  ๊ฐ€ ๋ฅผ ๊ตฌํ•˜๋ฆฌ๋ผ๋Š” ์•ฝ์†.

  • force : ์…ˆ๋ฏธ๋ฃฌ ๋ฌผ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๊ทธ ๊ฐ’์„ ์–ต์ง€๋กœ ๊ตฌํ•˜๋Š” ํ”„๋กœ์‹œ์ €

  • ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ e3

      (define (stream-ref s n)
        (if (= n 0)
            (stream-car s)
            (stream-ref (stream-cdr s) (- n 1))))
      
      (define (stream-map proc s)
        (if (stream-null? s)
            the-empty-stream
            (cons-stream (proc (stream-car s))
      		   (stream-map proc (stream-cdr s)))))
      
      (define (stream-for-each proc s)
        (if (stream-null? s)
            'done
            (begin (proc (stream-car s))
      	     (stream-for-each proc (stream-cdr s)))))
    
  • ๋ฆฌ์ŠคํŠธ ๋ฒ„์ „์˜ ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ vs ์ŠคํŠธ๋ฆผ ๋ฒ„์ „์˜ ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ e2

      (stream-car
       (stream-cdr
        (stream-filter prime?
      		 (stream-enumerate-interval 10000 1000000))))
      ; ์ž์„ธํ•œ ๋™์ž‘์€ ์ฑ… 418p, 420p ์ฐธ๊ณ 
      
      (car (cdr (filter prime?
      		  (enumerate-interval 10000 40000))))
    
  • ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ car๊ณผ cdr์„ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” cdr๋ฅผ ๋ฝ‘์•„์“ธ ๋•Œ cdr๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

3.5.2 ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ

  • ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ ๊ตฌํ˜„1 e04

      ; ์ •์ˆ˜
      (define (integers-starting-from n)
        (cons-stream n (integers-starting-from (+ n 1))))
      (define integers (integers-starting-from 1))
      ; 7๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š๋Š” ์ •์ˆ˜
      (define (divisible? x y) (= (remainder x y) 0))
      (define no-sevens
        (stream-filter (lambda (x) (not (divisible? x 7)))
      		 integers))
      ; ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
      (define (fibgen a b)
        (cons-stream a (fibgen b (+ a b))))
      (define fibs (fibgen 0 1))
    
  • ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ ๊ตฌํ˜„2 e05

      ; ์†Œ์ˆ˜ ์ŠคํŠธ๋ฆผ
      (define (sieve stream)
        (cons-stream
         (stream-car stream)
         (sieve (stream-filter
      	   (lambda (x)
      	     (not (divisible? x (stream-car stream))))
      	   (stream-cdr stream)))))
      (define primes (sieve (integers-starting-from 2)))
    
  • ์ŠคํŠธ๋ฆผ์„ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ฒŒ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

      ; ์žฌ๊ท€ ์ •์˜ ์†Œ์ˆ˜ ์ŠคํŠธ๋ฆผ
      (define primes
        (cons-stream
         2
         (stream-filter prime? (integers-starting-from 3))))
      
      (define (prime? n)
        (define (iter ps)
          (cond ((> (square (stream-car ps)) n) true)
      	  ((divisible? n (stream-car ps)) false)
      	  (else (iter (stream-cdr ps)))))
        (iter primes))
       }}}
       - ์–ด๋–ค ๊ณ„์‚ฐ ์‹œ์ ์—์„œ ๋‹ค์Œ์— ์†Œ์ˆ˜์ธ์ง€ ๋”ฐ์ ธ ๋ณด๋Š” ๋ฐ ํ•„์š”ํ•œ ๋งŒํผ primes ์ŠคํŠธ๋ฆผ์ด ๋งŒ๋“ค์–ด์ ธ์žˆ์Œ.
      
       * ex3-55
       {{{#!gcode
      ;; ex3-55.scm
      (define (partial-sums ps)
        (cons-stream (stream-car ps)
      	       (add-streams (stream-cdr ps)
      			   (partial-sums ps))))
    

3.5.3 ์ŠคํŠธ๋ฆผ ํŒจ๋Ÿฌ๋‹ค์ž„

  • ์ˆœ๊ฐ„์ˆœ๊ฐ„ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ „์ฒด ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ์ดˆ์ ์„ ๋‘๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์ ์˜ ์ƒํƒœ๋“ค์„ ํ•œ๋ฐ ๋ฌถ๊ฑฐ๋‚˜ ์„œ๋กœ ๋น„๊ตํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

์ŠคํŠธ๋ฆผ ํ”„๋กœ์„ธ์Šค๋กœ ๋ฐ˜๋ณต์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ์ƒํƒœ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์žฌ์ฃผ๋ฅผ ๋ถ€๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ , ๊ณ„์‚ฐ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•œ๊ฒฐ๊ฐ™์ด ์ฐจ๋ก€์—ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์ผ๊ด€๋œ ์—ฐ์‚ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

  • sqrt ํ”„๋กœ์‹œ์ €

      (define (sqrt-stream x)
        (define guesses
          (cons-stream 1.0
      		 (stream-map (lambda (guess)
      			       (sqrt-improve guess x))
      			     guesses)))
        guesses)
    
  • ex3-64

  • pi-stream

      ;; pi/4 = 1 - 1/3 + 1/5 - 1/7 ....
      (define (pi-summands n)
        (cons-stream (/ 1.0 n)
      	       (stream-map - (pi-summands (+ n 2)))))
      
      (define pi-stream
        (scale-stream (partial-sums (pi-summands 1)) 4))
    
  • pi-stream ๊ฐ€์† 1 : ์ฐจ๋ก€์—ด ๊ฐ€์†๊ธฐ (438p)

      (define (euler-transform s)
        (let ((s0 (stream-ref s 0))
      	(s1 (stream-ref s 1))
      	(s2 (stream-ref s 2)))
          (cons-stream (- s2 (/ (square (- s2 s1))
      			  (+ s0 (* -2 s1) s2)))
      		 (euler-transform (stream-cdr s)))))
      ;(display-stream (euler-transform pi-stream))
    
  • pi-stream ๊ฐ€์† 2 : ํƒœ๋ธ”๋กœ (439p)

      (define (make-tableau transform s)
        (cons-stream s
      	       (make-tableau transform
      			     (transform s))))
      
      (define (accelerated-sequence transform s)
        (stream-map stream-car
      	      (make-tableau transform s)))
      
      (display-stream (accelerated-sequence euler-transform pi-stream))
    

์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ

  • ์ฐจ๋ก€์—ด ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ํ‘œํ˜„ -> ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ์— ์ ์šฉํ•ด๋ณด์ž

  • 2.2.3์˜ prime-sum-pairs (161p) ์‘์šฉ

  • i+j๊ฐ€ ์†Œ์ˆ˜์ด๊ณ  i< =j์ธ ๋ชจ๋“  ์ •์ˆ˜ ์Œ(i,j)์˜ ์ฐจ๋ก€์—ด ๊ตฌํ•˜๊ธฐ

      ;;;;;;;; ๊ฐ„๋‹จํžˆ ์ด๋ ‡๊ฒŒ...
      (define prime-pairs
        (stream-filter (lambda (pair)
      		   (prime? (+ (car pair) (cadr pair))))
      		 int-pairs))
      
      ;;;;;;;; ๋ฌธ์ œ๋Š” int-pairs (442p)
      (define (interleave s1 s2)
        (if (stream-null? s1)
            s2
            (cons-stream (stream-car s1)
      		   (interleave s2 (stream-cdr s1)))))
      
      (define (pairs s t)
        (cons-stream
         (list (stream-car s) (stream-car t)) ;;;;;;;;; (S0 T0)
         (interleave ;;;;;;;; stream-append ๊ฐ™์€ ์ ‘๊ทผ๋ฒ•์€ ๋ถˆ๊ฐ€๋Šฅ (443p)
          (stream-map (lambda (x) (list (stream-car s) x))
      		(stream-cdr t)) ;;;;;;;;;; (S0 T1) (S0 T2) (S0 T3) ...
          (pairs (stream-cdr s) (stream-cdr t))))) ;;;;;;;;;;;; ์žฌ๊ท€
      
      (define int-pairs (pairs integers integers))
    

์‹ ํ˜ธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ŠคํŠธ๋ฆผ

  • ์‹ ํ˜ธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์˜ '์‹ ํ˜ธ'๋ฅผ ์ปดํ“จํ„ฐ ๊ณ„์‚ฐ ๋ฐฉ์‹์œผ๋กœ ํ‰๋‚ด๋‚ธ ๊ฒƒ์ด ์ŠคํŠธ๋ฆผ

  • ์—ฐ์†ํ•˜๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์˜ ์‹ ํ˜ธ ๊ฐ’๋“ค์„ ์ค„์ค„์ด ์ด์–ด์ง„ ์ŠคํŠธ๋ฆผ์˜ ์›์†Œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋œ๋‹ค.

  • ์ ๋ถ„๊ธฐ (447-448p)

      (define (integral integrand initial-value dt)
        (define int
          (cons-stream initial-value
      		 (add-streams (scale-stream integrand dt)
      			      int)))
        int)
    

3.5.4 ์ŠคํŠธ๋ฆผ๊ณผ ์…ˆ๋ฏธ๋ฃธ ๊ณ„์‚ฐ๋ฒ•

3.5.5 ๋ชจ๋“ˆ๋กœ ๋ฐ”๋ผ๋ณธ ํ•จ์ˆ˜์™€ ๋ฌผ์ฒด

  • ๋ฎ์–ด์“ฐ๊ธฐ(assignment) ๋ฐฉ์‹์˜ ์žฅ์  : ํฐ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€ํ’ˆ ์†์— ๋ณ€์ˆ˜๋กœ ๊ฐ์ถ”๊ฑฐ๋‚˜ ์บก์Аํ™”ํ•˜์—ฌ ๋ชจ๋“ˆ(์กฐ๋ฆฝ์‹) ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ์„ ์งœ๋งž์ถ”๊ธฐ ์ข‹๋‹ค.

  • ์ŠคํŠธ๋ฆผ ๊ธฐ๋ฒ•์œผ๋กœ ์กฐ๋ฆฝ์‹ ์„ค๊ณ„๋ฅผ ํ•ด๋ณด์ž

  • ์ŠคํŠธ๋ฆผ ๋ฐฉ์‹์˜ pi๊ฐ’ ๊ตฌํ•˜๊ธฐ(๋ชฌํ…Œ ์นด๋ฅผ๋กœ ๋ฐฉ๋ฒ• 296p)

      (define random-numbers
        (cons-stream random-init
      	       (stream-map rand-update random-numbers)))
      
      (define (map-successive-pairs f s)
        (cons-stream
         (f (stream-car s) (stream-car (stream-cdr s)))
         (map-successive-pairs f (stream-cdr (stream-cdr s)))))
      
      (define cesaro-stream
        (map-successive-pairs (lambda (r1 r2) (= (gcd r1 r2) 1))
      			random-numbers))
      
      (define (monte-carlo experiment-stream passed failed)
        (define (next passed failed)
          (cons-stream
           (/ passed (+ passed failed))
           (monte-carlo
            (stream-cdr experiment-stream) passed failed)))
        (if (stream-car experiment-stream)
            (next (+ passed 1) failed)
            (next passed (+ failed 1))))
      
      (define pi
        (stream-map (lambda (p) (sqrt (/ 6 p)))
      	      (monte-carlo cesaro-stream 0 0)))
      
      (stream-ref pi 100)
    
โš ๏ธ **GitHub.com Fallback** โš ๏ธ