SICP問題1.39

cont-frac にoperator を渡せるようにして、tan-cfを定義する

(define (cont-frac-ope fn fd k ope)
  (define (iter-frac i result)
    (let ((n (fn i))
	  (d (fd i)))
      (if (= i 0)
	  result
	  (iter-frac (- i 1) (/ n (ope d result))))))
  (iter-frac k 0)
)

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

一応テスト。合ってるのかどうかさっぱり分からん。

(tan-cf 1.0 1)
; 1.0
(tan-cf 1.0 2)
; 1.4999999999999998
(tan-cf 1.0 3)
; 1.5555555555555558
(tan-cf 1.0 4)
; 1.5573770491803278
(tan-cf 1.0 5)
; 1.5574074074074076
(tan-cf 1.0 6)
; 1.557407722401769
(tan-cf 1.0 7)
; 1.5574077246432194
(tan-cf 1.0 8)
; 1.557407724654856
(tan-cf 1.0 9)
; 1.557407724654902
(tan-cf 1.0 10)
; 1.557407724654902

Web の他の人の答え見てたら別に cont-frac-ope なんて定義する必要ナサゲだった。
確かにNk/Dkの部分の符号が反転すればよいだけか。ということで書き直し。

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