問題3.52 – SICP(計算機プログラムの構造と解釈)その146

問題3.52

メモライズした場合

SICP 問題3.52 メモライズした場合

(load "./stream.scm")

(define sum 0)
;; sum の初期値 0

(define (accum x)
  (set! sum (+ x sum))
  sum)
;; sum を x だけ増加させて sum を返す
sum
gosh> 0

(define seq (stream-map accum (stream-enumerate-interval 1 20)))
;; '((accum 1) (accum 2) (accum 3) ... (accum 19) (accum 20))
;; ただし、ストリームのために呼び出されるまで accum は実行されない
sum
gosh> 1

(define y (stream-filter even? seq))
;; seq の内で偶数の場合のみをフィルタリングする
sum
gosh> 6

(define z (stream-filter (lambda (x) (= (remainder x 5) 0))
                         seq))
;; seq の内で 5 で割り切れるもののみをフィルタリングする
sum
gosh> 10

(stream-ref y 7) ;; y の内の8番目の値(0から数える)
gosh> 136

(display-stream z) ;; z を全て表示する
gosh> 
10
15
45
55
105
120
190
210done

sum
gosh> 210

メモライズしなかった場合

メモライズしなかった場合は、accum が再び実行されて sum の値が余分に累積される。

SICP 問題3.52 メモライズしなかった場合

(load "./stream-nomemo.scm")

(define sum 0)
;; sum の初期値 0

(define (accum x)
  (set! sum (+ x sum))
  sum)
;; sum を x だけ増加させて sum を返す
sum
gosh> 0

(define seq (stream-map accum (stream-enumerate-interval 1 20)))
;; '((accum 1) (accum 2) (accum 3) ... (accum 19) (accum 20))
;; ただし、ストリームのために呼び出されるまで accum は実行されない
sum
gosh> 1

(define y (stream-filter even? seq))
;; seq の内で偶数の場合のみをフィルタリングする
sum
gosh> 6

(define z (stream-filter (lambda (x) (= (remainder x 5) 0))
                         seq))
;; seq の内で 5 で割り切れるもののみをフィルタリングする
sum
gosh> 15

(stream-ref y 7) ;; y の内の8番目の値(0から数える)
gosh> 162

(display-stream z) ;; z を全て表示する
gosh> 
15
180
230
305done

sum
gosh> 362
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»