sicp ch3 5 - andstudy/forge GitHub Wiki
- ๊ณ์ฐ ๋ฌผ์ฒด ์์ ๋ณ์๋ฅผ ์จ๊ฒจ์ ์ํ๊ฐ ์๋ ์ง์ง ๋ฌผ์ฒด๋ฅผ ํ๋ด๋ด๊ณ ,
- ์ปดํจํฐ์ ๊ณ์ฐ ์๊ฐ์ผ๋ก ์ง์ง ์๊ฐ์ ๋ณํ๋ฅผ ๋ํ๋๋ค
- ๊ณ์ฐ ๋ฌผ์ฒด์ ๋ณ์ ๊ฐ์ ๋ฎ์ด์ฐ๋ ๊ฒ์ผ๋ก ์๊ฐ์ ๋ฐ๋ผ ๋ฌผ์ฒด์ ์ํ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์ ํํ
- ์คํธ๋ฆผ ๋ฐ์ดํฐ ๊ตฌ์กฐ : ๋ฎ์ด์ฐ๊ธฐ(assignment) ๋๋ฌธ์ ์๊ฒจ๋๋ ๋ณต์กํ ๋ฌธ์ ๋ค์ ๋ฐ์์ํค์ง ์์ผ๋ฉด์ ์๊ฐ ํจ์๋ฅผ ํ๋ด๋ด๊ธฐ ์ํด ์คํธ๋ฆผ์ด๋ผ๋ ์ฐจ๋ก์ด์ ํ ํํ๋ฅผ ์ด์ฉํ์ฌ ์๊ฐ์ ๋ฐ๋ฅธ ์์คํ ์ ๋ณํ๋ฅผ ํํํ๋ค.
- ์ ๋ฏธ๋ฃธ ๊ณ์ฐ๋ฒ(delayed evaluation) : ์คํธ๋ฆผ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ฉด ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ชจ๋ ํํ๋ ฅ์ ์ ๋๋ก ๋ด์๋ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋์ ํ ๋ฐฉ๋ฒ. ์์ฃผ ํฐ ์ฐจ๋ก์ด, ๋์๋ ์ฐจ๋ก์ด๋ ๋ํ๋ผ ์ ์๋ค.
- SICP/2.2๊ณ์ธต๊ตฌ์กฐ๋ฐ์ดํฐ์๋ซํ์ฑ์ง์์ ๊ณต๋ถํ ์ฐจ๋ก์ด ์ฐ์ฐ (map, filter, accumulate)
-
''' ๊ตฌ๊ฐ์ ์์๋ฅผ ๋ชจ๋ ๋ํ๋ ํ๋ก๊ทธ๋จ '''
;; ๋ํ์ด ๋ฐฉ์ (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 ๊ตฌ๊ฐ ์์ ์๋ฅผ ํ๋์ฉ ๊บผ๋ด๋ฉด์ ๊ณง๋ฐ๋ก ์์ ๊ฒ์ฌ์ ๋ํ๊ธฐ ์ํ
- -> ์ด๊ฑด ์ด์ฉ๊ฑด๋ฐ?
- 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๋ฅผ ๊ณ์ฐํ๋ค.
-
๋ฌดํ ์คํธ๋ฆผ ๊ตฌํ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))))
- ์๊ฐ์๊ฐ ๋ณํ๋ ์ํ๊ฐ ์๋๋ผ, ์ ์ฒด ์๊ฐ์ ํ๋ฆ์ ์ด์ ์ ๋๊ณ ์๊ฐํ ์ ์๋ค.
- ์๋ก ๋ค๋ฅธ ์์ ์ ์ํ๋ค์ ํ๋ฐ ๋ฌถ๊ฑฐ๋ ์๋ก ๋น๊ตํ๊ธฐ ํธํ๋ค.
-
์คํธ๋ฆผ์ผ๋ก ์ํ๋ฅผ ํํํ๋ ๋ฐฉ์์ด ์ํ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๋ ๋ฐฉ์๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
-
ํ์ง๋ง ๋ช ๊ฐ์ง ์ฌ์ฃผ๋ฅผ ๋ถ๋ฆด ์ ์๋ค๋ ์ , ๊ณ์ฐ์ ํ์ํ ๋ชจ๋ ์ํ๋ฅผ ํ๊ฒฐ๊ฐ์ด ์ฐจ๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ํํํ๊ณ ์ผ๊ด๋ ์ฐ์ฐ์ ์ ์ฉํ ์ ์๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
-
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)
-
๋ฎ์ด์ฐ๊ธฐ(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)