開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力, オブジェクトおよび状態)、3.5(ストリーム)、3.5.1(ストリームは遅延リスト)、ストリームの実装の働き、delayとforceの実装、問題 3.52を解いてみる。
その他参考書籍
問題 3.52
各式が評価し終わったときのsumの値。
(define sum 0) ;; 0 (define (accum x) (set! (+ x sum)) sum) ;; 0 (define seq (stream-map accum (stream-enumerate-interval 1 20))) ;; (accum 1) ;; 1 (define y (strem-filter even? seq)) ;; 1 (accum 2):3 (accum 3):6 ;; 6 (define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq)) ;; 1 3 6 (accum 4): 10 ;; 10 (stream-ref y 7) ;; stream 1 3 6(0) 10(1) 15 21 28(2) 36(3) 45 55 66(4) 78(5) 91 105 120(6) 136(7) ;; ということで、評価に応じて印字される応答は136 ;; sumの値は136 (display-stream z) ;; 上記のstreamの続き 153 171 190 210 ;; 印字される応答 10 15 45 55 105 120 190 210 done ;; 返される値 ;; sumの値は 210
(delay <exp>)を単に(lambda () <exp>)で実装し、memo-procの用意するメモ化による最適化を使わなかった時。
(define sum 0) ;; sum 0 (define (accum x) (set! (+ x sum)) sum) ;; sum 0 (define seq (strem-map accum (strem-enumerate-interval 1 20))) ;; sum 1 ;; seq (stream-cons 1 (strem-map accum (strem-enumerate-interval 2 20))) ;; seq (cons 1 (delay (stream-map accum (strem-enumerate-iterval 2 20)))) (define y (strem-filter even? seq)) ;; 1 (accum 2):3 (accum 3):6 ;; sum 6 ;; y (stream-cons 6 (strem-filter even? (stream-enumerate-interval 4 20))) ;; y (cons 6 (delay (stream-filter even? (stream-enumerate-interval 4 20)))) (define z (stream-filter (lambda (x) (= (remainder x 5) 0)) seq)) ;; 1 (accum 2):8 (accum 3): 11 (accum 4): 15 ;; sum 15 ;; z (stream-cons 15 (stream-filter (lambda (x) (= (remainder x 5) 0)) ;; (stream-map accum (stream-enumerate-interval 5 20)))) (stream-red y 7) ;; 0番目: 6 ;; (accum 4): 19 ;; (accum 5): 24 ;; 1番目: 24 ;; (accum 6): 30 ;; 2番目: 30 ;; (accum 7): 37 ;; (accum 8): 45 ;; (accum 9): 54 ;; 3番目: 54 ;; (accum 10): 64 ;; 4番目: 64 ;; (accum 11): 75 ;; (accum 12): 87 ;; (accum 13): 100 ;; 5番目: 100 ;; (accum 14): 114 ;; 6番目: 114 ;; (accum 15): 129 ;; (accum 16): 145 ;; (accum 17): 162 ;; 7番目: 162 ;; よって、評価に応じて印字される応答は162 ;; sumの値は162 (display-stream z) ;; (accum 5): 167 ;; (accum 6): 173 ;; (accum 7): 180 ;; (accum 8): 188 ;; (accum 9): 197 ;; (accum 10): 207 ;; (accum 11): 218 ;; (accum 12): 230 ;; (accum 13): 243 ;; (accum 14): 257 ;; (accum 15): 272 ;; (accum 16): 288 ;; (accum 17): 305 ;; (accum 18): 323 ;; (accum 19): 342 ;; (accum 20): 362 ;; よって印字される応答は以下のようになる 15 180 230 305 done ;; 返される値 ;; sumの値は362
memo-procの用意するメモ化による最適化を使わなかった場合、この例だと(accum 2)、(accum 3)、(accum 4)が2回以上走ることに、すなわち上記の最適化を使った場合に比べて手続きaccumによるsumへの代入する回数、数値が多くなり、その分sumの値や評価に応じて印字される応答が違ってくる。
0 コメント:
コメントを投稿