SICP演習1.37で
SICP のセクション 1.3.3セクションの最後 (1.3.4 の直前) まで下にスクロールして、演習 [セクションの 3 番目の演習] を見つけます。
問題に従って、 cont-frac を次のように定義しました
(define (cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (cont-frac n d (- k 1))))
)
)
ソリューション リンクによると、上記のコードは一貫しているようです。(lamda (i) 1.0)
手順であるソリューションの (a) の部分で、n と d が のように置換されると、ソリューションの 2 番目の部分で問題が発生します。
これを の手順で代入するとどうなるか理解できませんcont-frac
。私が試したとき、間違ったタイプの引数というエラーがあります
編集 1
ソリューション全体を追加しました。問題は解決しますが、セクションの本質を捉えていません。これは演習 1.37、1.38、1.39 の解答です。プログラムは、以下のリンクのソリューションが行う一般的な方法として手順を使用しません1.37のソリューション、1.38のソリューション、1.39のソリューション
以下の手順phi
およびのプログラムでは、k は
手順のe-2-val
連分数のステップ数です。k はラジアン単位の角度です (正確な値を得るには、ステップ数は 1000 です)。tan
#!/usr/local/bin/guile \
-e main -s
!#
(define (finite-cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (finite-cont-frac n d (- k 1))))))
(define (e-2 n d k1 c k)
(define (d-val)
(if (= (modulo k1 3) 1)
(+ c 2)
1))
(define (c-val)
(if (= (d-val) 1) c (d-val)))
(if (= k 0)
0
(/ n (+ (d-val) (e-2 n (d-val) (+ k1 1) (c-val) (- k 1))))))
(define (tan-cf n k d k1)
(define (d-val)
(if (= k1 0) 1 (+ d 2)))
(if (= k 0)
0
(/ n (+ (d-val) (tan-cf n (- k 1) (d-val) (+ k1 1))))))
(define (tan-man x kk)
(let ((a (- (* x x))))
(tan-cf a kk 1 0)))
(define rrr 80.0)
(define (main args)
(let* ((k (string->number (list-ref args 1)))
(phi (/ 1.0 (finite-cont-frac 1.0 1.0 k)))
(e-2-val (e-2 1.0 1 0.0 0 k))
(tt (/ (tan-man k 1000) (- 0.0 k))))
(display tt)
(newline)))