0

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

4

1 に答える 1