2013年5月10日金曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の1(手続きによる抽象の構築)、1.3(高階手続きによる抽象)、1.3.3(一般的方法としての手続き)の問1.38、問1.39を解いてみる。

その他参考書籍

問題 1.38.

コード

sample.scm

(define (cont-frac n d k)
  (define (frac-iter i result)
    (if (= i 0)
        result
        (frac-iter (- i 1) (/ (n i) (+ (d i) result)))))
  (frac-iter k 0))

(define (cont-frac-iter n d k i)
  (newline)
  (display k)
  (display " *** ")
  (define x (cont-frac n d k))
  (display (+ x 2))
  (if (< k i)
      (cont-frac-iter n d (+ k 1) i)))

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

1 ]=> 
(cont-frac-iter (lambda (i) 1.0)
                (lambda (i) (if (= (remainder i 3) 2)
                                   (* 2 (/ (+ i 1) 3))
                                   1.0))
                1
                10)

1 *** 3.
2 *** 2.6666666666666665
3 *** 2.75
4 *** 2.7142857142857144
5 *** 2.71875
6 *** 2.717948717948718
7 *** 2.7183098591549295
8 *** 2.718279569892473
9 *** 2.718283582089552
10 *** 2.7182817182817183
;Unspecified return value

1 ]=> 

問題 1.39.

コード

sample.scm

(define (cont-frac n d k)
  (define (frac-iter i result)
    (if (= i 0)
        result
        (frac-iter (- i 1) (/ (n i) (+ (d i) result)))))
  (frac-iter k 0))

(define (tan-cf x k)
  (cont-frac (lambda (i) (if (= i 1)
                         x
                         (* -1
                            (square x))))
             (lambda (i) (- (* 2 i) 1))
             k))

(define (tan-cf-iter x n)
  (tan-cf-iter-inner x 1 n))

(define (tan-cf-iter-inner x k n)
  (newline)
  (display k)
  (display " *** ")
  (define a (tan-cf x k))
  (display a)
  (if (< k n)
      (tan-cf-iter-inner x (+ k 1) n)))

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

1 ]=> (tan-cf 0 10)

;Value: 0

1 ]=> (tan-cf (/ 3.14 4) 10)

;Value: .9992039901050428

1 ]=> (tan-cf (/ (* 3 3.14) 4) 10)

;Value: -1.0023918385609834

1 ]=> (tan-cf (* -1 (/ 3.14 4)) 10)

;Value: -.9992039901050428

1 ]=> (tan-cf (* -1 (/ (* 3 3.14) 4)) 10)

;Value: 1.0023918385609834

1 ]=> (tan-cf 3.14 10)

;Value: -1.592656810496839e-3

1 ]=> (tan-cf-iter 3.14 10)

1 *** 3.14
2 *** -1.3732579159134644
3 *** -.36552838016558864
4 *** -.08327550432757211
5 *** -1.2564132006352343e-2
6 *** -2.5047690032355793e-3
7 *** -1.6447971997619203e-3
8 *** -1.5948570601372388e-3
9 *** -1.592726838150251e-3
10 *** -1.592656810496839e-3
;Unspecified return value

1 ]=> (tan-cf-iter (/ 3.14 4) 10)

1 *** .785
2 *** .9879288103952764
3 *** .9989925703264279
4 *** .9992018697579907
5 *** .9992039767162123
6 *** .9992039900467972
7 *** .9992039901048574
8 *** .9992039901050424
9 *** .9992039901050428
10 *** .9992039901050428
;Unspecified return value

1 ]=> (tan-cf-iter (/ (* 3 3.14) 4) 10)

1 *** 2.355
2 *** -2.774913836274192
3 *** -1.218205755862148
4 *** -1.0250708291420498
5 *** -1.0038605190931955
6 *** -1.0024543945558377
7 *** -1.0023937364752231
8 *** -1.0023918818442126
9 *** -1.0023918393212117
10 *** -1.0023918385609834
;Unspecified return value

1 ]=> (tan-cf-iter (* -1 (/ 3.14 4)) 10)

1 *** -.785
2 *** -.9879288103952764
3 *** -.9989925703264279
4 *** -.9992018697579907
5 *** -.9992039767162123
6 *** -.9992039900467972
7 *** -.9992039901048574
8 *** -.9992039901050424
9 *** -.9992039901050428
10 *** -.9992039901050428
;Unspecified return value

1 ]=> (tan-cf-iter (* -1 (/ (* 3 3.14) 4)) 10)

1 *** -2.355
2 *** 2.774913836274192
3 *** 1.218205755862148
4 *** 1.0250708291420498
5 *** 1.0038605190931955
6 *** 1.0024543945558377
7 *** 1.0023937364752231
8 *** 1.0023918818442126
9 *** 1.0023918393212117
10 *** 1.0023918385609834
;Unspecified return value

1 ]=> (tan-cf-iter 3.14 10)

1 *** 3.14
2 *** -1.3732579159134644
3 *** -.36552838016558864
4 *** -.08327550432757211
5 *** -1.2564132006352343e-2
6 *** -2.5047690032355793e-3
7 *** -1.6447971997619203e-3
8 *** -1.5948570601372388e-3
9 *** -1.592726838150251e-3
10 *** -1.592656810496839e-3
;Unspecified return value

1 ]=> (tan-cf-iter 2.0 10)

1 *** 2.
2 *** -6.000000000000002
3 *** -2.4444444444444446
4 *** -2.2033898305084745
5 *** -2.1858585858585857
6 *** -2.1850643117680937
7 *** -2.185040388213639
8 *** -2.185039871780394
9 *** -2.185039863369829
10 *** -2.1850398632626273
;Unspecified return value

1 ]=> (tan-cf-iter 5.0 10)

1 *** 5.
2 *** -.6818181818181818
3 *** .37037037037037035
4 *** 1.835443037974684
5 *** 29.305555555555483
6 *** -5.0538315389487
7 *** -3.6106314463060607
8 *** -3.4085588621288947
9 *** -3.3831320829619007
10 *** -3.380704932187744
;Unspecified return value

1 ]=> (tan-cf-iter 10.0 10)

1 *** 10.
2 *** -.3092783505154639
3 *** 1.452991452991453
4 *** -1.5967885816235503
5 *** 4.0846298591032164e-2
6 *** 1.479788993486389
7 *** -4.5453357495488795
8 *** -.8072582019739348
9 *** -.15350381575394778
10 *** .2202426219807905
;Unspecified return value

1 ]=> ^D
End of input stream reached.
Moriturus te saluto.

0 コメント:

コメントを投稿