Продолжение дроби Python
Я новичок в Python, и меня попросили создать программу, которая будет принимать входные данные как неотрицательное целое число n, а затем вычислять приближение для значения e, используя первые n + 1 слагаемых непрерывной дроби:
Я попытался расшифровать вопрос, но не могу точно понять все, что он задает. Я не ищу точного ответа, но, надеюсь, пример, который поможет мне на моем пути.
Это точный вопрос
Ниже приведен код, который я сделал с продолжением дробей раньше.
import math
# Get x from user
x = float(input("Enter x = "))
# Calculate initial variables and print
a0 = x//1
r0 = x-a0
print("a0 =", a0, "\tr0 =", r0)
# Calculate ai and ri for i = 1,2,3 and print results
a1 = 1/r0//1
r1 = 1/r0 - a1
print("a1 =", a1, "\tr1 =", r1)
a2 = 1/r1//1
r2 = 1/r1 - a2
print("a2 =", a2, "\tr2 =", r2)
a3 = 1/r2//1
r3 = 1/r2 - a3
print("a3 =", a3, "\tr3 =", r3)
2 ответа
Без дополнительной информации, вероятно, будет хорошей идеей ™ использовать простое продолжение дроби e, как показано в Википедии:
е = [2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, 1, 1, 10, 1, 1, 12, 1, 1, ...]
Эта последовательность может быть легко создана с использованием простого понимания списка.
Чтобы оценить простое продолжение дробной дроби, нам нужно обработать список в обратном порядке.
Следующий код будет работать на Python 2 или Python 3.
#!/usr/bin/env python
''' Calculate e using its simple continued fraction expansion
See http://stackru.com/q/36077810/4014959
Also see
https://en.wikipedia.org/wiki/Continued_fraction#Regular_patterns_in_continued_fractions
Written by PM 2Ring 2016.03.18
'''
from __future__ import print_function, division
import sys
def contfrac_to_frac(seq):
''' Convert the simple continued fraction in `seq`
into a fraction, num / den
'''
num, den = 1, 0
for u in reversed(seq):
num, den = den + num*u, num
return num, den
def e_cont_frac(n):
''' Build `n` terms of the simple continued fraction expansion of e
`n` must be a positive integer
'''
seq = [2 * (i+1) // 3 if i%3 == 2 else 1 for i in range(n)]
seq[0] += 1
return seq
def main():
# Get the the number of terms, less one
n = int(sys.argv[1]) if len(sys.argv) > 1 else 11
if n < 0:
print('Argument must be >= 0')
exit()
n += 1
seq = e_cont_frac(n)
num, den = contfrac_to_frac(seq)
print('Terms =', n)
print('Continued fraction:', seq)
print('Fraction: {0} / {1}'.format(num, den))
print('Float {0:0.15f}'.format(num / den))
if __name__ == '__main__':
main()
выход
Terms = 12
Continued fraction: [2, 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8]
Fraction: 23225 / 8544
Float 2.718281835205993
Передайте программе аргумент 20, чтобы получить наилучшее приближение, возможное с использованием чисел с плавающей точкой Python: 2.718281828459045
Значение е может быть выражено как предел следующей непрерывной дроби:
e = 2 + 1 / (1 + 1 / (2 + 2 / (3 + 3 / (4 + 4 / (...))))))
Начальный 2 + 1 /
выходит за пределы основного шаблона, но после этого он просто продолжается, как показано на рисунке. Ваша задача - оценить это до n
глубокий, после чего вы останавливаетесь и возвращаете значение до этой точки.
Убедитесь, что вы выполняете расчет с плавающей запятой.