2014年8月13日水曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.5(ストリーム)、3.5.3(ストリームパラダイムの開発)、反復をストリームプロセスとして形式化する、問題 3.65.を解いてみる。

その他参考書籍

問題 3.65.

コード(BBEdit, Emacs)

sample65.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(load "./stream.scm")

(define (enumerate-interval low high)
  (if (> low high)
      '()
      (cons low
            (enumerate-interval (+ low 1)
                                high))))

(define (test stream)
  (for-each (lambda (n)
              (print (stream-ref stream n)))
            (enumerate-interval 0 9)))

(define (partial-sums stream)
  (cons-stream (stream-car stream)
               (add-streams (partial-sums stream)
                            (stream-cdr stream))))

(define (square x) (* x x))

(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)))))
                          
                               
(define (log2-summands n)
  (cons-stream (/ 1 n)
               (stream-map -
                           (log2-summands (+ n 1)))))

(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)))

(define log2-stream
  (partial-sums (log2-summands 1.0)))

(print "log手続き")
(print (log 2))

(print "ストリーム")
(print "通常")
(test log2-stream)

(print "加速")
(test (euler-transform log2-stream))

(print "再帰的な加速(ストリームのストリーム, タブロー)")
(test (accelerated-sequence euler-transform log2-stream))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample65.scm
log手続き
0.6931471805599453
ストリーム
通常
1.0
0.5
0.8333333333333333
0.5833333333333333
0.7833333333333332
0.6166666666666666
0.7595238095238095
0.6345238095238095
0.7456349206349207
0.6456349206349207
加速
0.7
0.6904761904761905
0.6944444444444444
0.6924242424242424
0.6935897435897436
0.6928571428571428
0.6933473389355742
0.6930033416875522
0.6932539682539683
0.6930657506744464
再帰的な加速(ストリームのストリーム, タブロー)
1.0
0.7
0.6932773109243697
0.6931488693329254
0.6931471960735491
0.6931471806635636
0.6931471805604039
0.6931471805599445
0.6931471805599427
0.6931471805599454
$

0 コメント:

コメントを投稿