Почему звуковой сигнал означает, что моя непрерывная дробь не приближается должным образом?

Читая больше SICP, я застрял на упражнение 1.3.8. Мой код правильно работает для аппроксимации 1/фи, но не работает для аппроксимации e-2.

(define (cont-frac n d k)
  (define (frac n d k)
        (if (= k 0)
            1.0
            (+ (d k) (/ (n (+ k 1)) (frac n d (- k 1))))))
    (/ (n 1) (frac n d k)))

(define (eulers-e-2)
  (cont-frac (lambda (i) 1.0) 
             (lambda (i)
               (if (= (remainder (+ i 1) 3) 0)
                   (* 2.0 (/ (+ i 1) 3))
                   1.0))
             100))

(define (1-over-phi)
  (cont-frac (lambda (i) 1.0)
             (lambda (i) 1.0)
             100))

Вместо того, чтобы получить 0,7 бла-бла-бла для e-2, я получаю 0,5 бла-бла-что-то. Я не могу понять, почему. Я почти уверен, что правильно определил "d" в функции "eulers-e-2".

Редактировать: Спасибо, ребята, я вычислял это в обратном порядке. Вот фиксированный код.

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

person hraesvelgr    schedule 06.10.2010    source источник
comment
@Seth: это было бы «так много скобок».   -  person High Performance Mark    schedule 06.10.2010


Ответы (1)


Кажется, вы рассчитываете следующее:

N1/(D100 + (N101/ D99 + N100/(D98 + N99/(..))))

Вместо

N1/(D1 + N2/(D2 + ...))

Поскольку N и D одинаковы (все единицы) для 1/фи, вы получите правильный ответ.

person Community    schedule 06.10.2010