Продолжение дроби постоянной е

Я очень плохо знаком с Python. Я только недавно начал заниматься информатикой. Я, однако, застрял в этой теме относительно того, как мне получить значение продолженной доли e константа после того, как я ввел число. Пожалуйста, не решайте это для меня, но научите меня, как это сделать. Я не уверен, стоит ли мне использовать циклы while или для циклов, и даже если я это сделаю, я не уверен, как это сделать.

Это полная формулировка,

Это вопрос

2 ответа

Можно использовать следующий код в python2.

# exp(1) from the generalized continued fraction
def expOneFromContinuedFraction( n=30 ):
    """Compute an approximative value of exp(1) from
    e ~ 2 + 1/( 1+1/ (2+2/ (3+3/ ( ... n+n/(n+1) ) ) ) )
    """

    a = 1. + n
    for k in range(n, 0, -1):
        a = k + k/a
    return 2+1/a

for n in range(1,11):
    print "n = %2s :: approximation is %.24f" % ( n, expOneFromContinuedFraction(n) )

Копия + вставка в интерпретатор ipython дала мне:

n =  1 :: approximation is 2.666666666666666518636930
n =  2 :: approximation is 2.727272727272727514957751
n =  3 :: approximation is 2.716981132075471538911415
n =  4 :: approximation is 2.718446601941747697850360
n =  5 :: approximation is 2.718263331760264023273521
n =  6 :: approximation is 2.718283693893449814993346
n =  7 :: approximation is 2.718281657666403727802162
n =  8 :: approximation is 2.718281842777827250756673
n =  9 :: approximation is 2.718281827351874291309741
n = 10 :: approximation is 2.718281828538485989099627

Я надеюсь, что ясно, где Python теряет точность.

Обратите внимание, что можно также выполнить точные вычисления, например, используя пакет поддержки дроби. В таких ситуациях я использую шалфей вместо питона. Тот же язык, но с большим количеством "батарей". Аналогичная версия кода, где мы не начинаем с поплавка a = 1. + n, но с целым числом шалфея a = 1+n дает фракции. Вот точное вычисление с апостериорным числовым значением.

def sageExpOneFromContinuedFraction( n=30 ):
    a = n+1
    for k in range(n, 0, -1):
        a = k + k/a
    return 2 + 1/a

for n in range(1,11):
    a = sageExpOneFromContinuedFraction(n)
    print "n = %2s :: exp(1) ~ %s ~ %s" % ( n, a, a.n(digits=50) )

Результаты, которые лучше отражают периодичность десятичного представления рациональных чисел...

n =  1 :: exp(1) ~ 8/3 ~ 2.6666666666666666666666666666666666666666666666667
n =  2 :: exp(1) ~ 30/11 ~ 2.7272727272727272727272727272727272727272727272727
n =  3 :: exp(1) ~ 144/53 ~ 2.7169811320754716981132075471698113207547169811321
n =  4 :: exp(1) ~ 280/103 ~ 2.7184466019417475728155339805825242718446601941748
n =  5 :: exp(1) ~ 5760/2119 ~ 2.7182633317602642756016989145823501651722510618216
n =  6 :: exp(1) ~ 45360/16687 ~ 2.7182836938934499910109666207227182836938934499910
n =  7 :: exp(1) ~ 44800/16481 ~ 2.7182816576664037376372792913051392512590255445665
n =  8 :: exp(1) ~ 3991680/1468457 ~ 2.7182818427778273384920361985403726496587915070036
n =  9 :: exp(1) ~ 43545600/16019531 ~ 2.7182818273518744088075986743931517096224602330742
n = 10 :: exp(1) ~ 172972800/63633137 ~ 2.7182818285384861664135778815996451660083959085657

Примечание: пожалуйста, покажите в следующий раз свои усилия по вычислению

При решении этих математических вопросов лучшая стратегия, которую я использую, состоит в том, чтобы попытаться разбить проблему на крошечные шаги. Так выглядит функция для n = 1,2,3.

n = 1
c = 1/2
c = 1/(1+c)
print(2+c)

n = 2
c = 2/3
c = 1/(2+c)
c = 1/(1+c)
print(2+c)

n = 3
c = 3/4
c = 2/(3+c)
c = 1/(2+c)
c = 1/(1+c)
print(2+c)

Затем я попытался бы вручную определить, как будет выглядеть функция для n=4 и n=5. Как только я пойму это, обобщите это своими словами. Затем преобразуйте это на свой язык программирования.

Другие вопросы по тегам