問題3.52 – SICP(計算機プログラムの構造と解釈)その146
2009年04月05日
問題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
の値が余分に累積される。
(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
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542