Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Вычисление дроби рекурсией. Python

#python


Дано действительное число x!=0. Вычислить дробь, используя рекурсивную подпрограмму:

def recurs(i,x):
    i*=2
    if i < 256:
        return x*x+i/i**x
    else:
        return x*x+i/x*x
print(recurs(int(input()),int(input()))


Ответ дает, но я не уверен в правильности программы. Может i не с клавиатуры
    


Ответы

Ответ 1



Ещё одна реализация для сравнения результатов: def fraction(x, maxi=0x100): def recur(i): return x**2 + (i / recur(i << 1) if i <= maxi else 0) return x / recur(2) Пример: >>> fraction(3, 4) 0.3256704980842912 >>> fraction(10) 0.09998001198642725
Для проверки можно независимо найти значение, используя обобщённую цепную дробь: def fraction(x): n = 9 # 2**(9 - 1) == 256 a = [None] + [x] + [2**(i-1) for i in range(2, n + 1)] b = [0] + [x**2] * n # @cached() def A(n): return 1 if n == -1 else b[0] if n == 0 else b[n]*A(n-1) + a[n]*A(n-2) # @cached() def B(n): return 0 if n == -1 else 1 if n == 0 else b[n]*B(n-1) + a[n]*B(n-2) return A(n) / B(n) Пример: >>> fraction(10) 0.09998001198642727 Для больших значений: fraction(x) ~ 1/x.
Чтобы с произвольной заданной точностью посчитать значения, можно decimal.Decimal в обоих реализациях использовать: >>> from decimal import Decimal >>> fraction(Decimal(10)) Decimal('0.09998001198642726105630197652') fractions.Fraction вычисления позволяет точно проводить в этом случае (return Fraction(A(n), B(n))): print(fraction(10)) # -> 1283224212628/12834807549355 При использовании float, первое решение теряет точность (...725 вместо ...727). Но проверка с использованием fractions.Fraction подтверждает, что оба способа вычисления идентичны.

Ответ 2



def f(x, mx, n=2): if n == mx: return x**2 + n / x**2 return x**2 + n / f(x, mx, n*2) def func(x, i=256): return x / f(x, i, 2) Проверка: In [13]: 3 / ( 9 + 2 / ( 9 + 4/9) ) Out[13]: 0.3256704980842912 In [14]: func(3, 4) Out[14]: 0.3256704980842912 In [15]: func(10, 256) Out[15]: 0.09998001198642725

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

Отправить комментарий