Вычислить e, используя разложение Эйлера


Поставлены следующие задачи:

Упражнения 1.38. В 1737 году, швейцарская математик Леонард Эйлер опубликовал мемуары де Fractionibus Continuis, который включал непрерывная дробь расширение для E - 2, где E - основание натуральных логарифмов. В эта фракция, Н. И. все 1, и Ди последовательно 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, .... Написать программу что использует ваш Конт-ГРП процедуры упражнение 1.37 приблизительным е на основе расширения Эйлера.

Я написал это решение:

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

(define (divisible? a b) (= (remainder a b) 0))
(define (compute-e k)
  (define (n i) 1)
  (define (d i) (cond ((= i 1) 1)
                      ((= i 2) 2)
                      ((divisible? (- i 1) 3) 
                       (* (/ (- i 1) 3.0) 2.0))
                      (else 1.0)))
  (+ 2 (cont-frac n d k)))

Что вы думаете?



Комментарии
1 ответ

Ваше определение д - это не совсем правильно. Она выдает неверные результаты для некоторых значений я , и он имеет два особых случаев, которые не являются необходимыми. Возможное определение:

  (define (d i)
(cond
((divisible? (+ i 1) 3)
(* (/ (+ i 1) 3) 2))
(else 1)))

Это потому, что я в 1-индексации (серия начинается с I = 1). Если вы хотите десятичные дроби, а не дробь, как результат, изменить множитель 2.0 и значение еще в 1.0.

Другой способ, чтобы написать д - это:

  (define (d i)
(let
((d-value (* (/ (+ i 1) 3) 2)))
(if (integer? d-value) d-value 1)))

2
ответ дан 31 марта 2011 в 11:03 Источник Поделиться