Форум » Рекурсивные процедуры и функции » 16-134 » Ответить

16-134

vun: Алгоритм вычисления функции F(n), где n – натуральное число, задан следующими соотношениями: F(n) = 1, если n = 1 F(n) = n · F(n – 1) + 1, если n > 1. Чему равно значение выражения F(3303) / F(3300)? В ответе укажите только целую часть числа. ## uses school; function f(n: integer):integer:=n=1?1:n>1?n*f(n-1)+1:0; print (f(3303)/f(3300)); ответ 1.45492734879547 целая часть 1 что не так? в ответах 36002376306

Ответов - 4

MrAndrewson: F3303 = 3303 * F3302 + 1 = 3303*(3302 * F3301 + 1) + 1 = 3303* (3302 * (3301 * F3300 + 1) + 1) + 1 = 3303* 3302 * 3301 * F3300 + 3303 * 3302 + 3303 + 1 = ... Не сократится это по-хорошему. Поскольку тут считается факториал, то первое слагаемое - произведение чисел - будет много больше остальных. Задача не на ручное решение, видимо. Динамикой на питоне прекрасно решается. [pre2]f = [0] * 5000 for n in range(3304): if n == 1: f[n] = 1 else: f[n] = n * f[n - 1] + 1 print(f[3303] / f[3300])[/pre2] А в своем решении Вы ошиблись в выборе типа данных [pre2]## uses school; function f(n: integer):BigInteger:=n=1?1:n>1?n*f(n-1)+1:0; print (f(3303)/f(3300));[/pre2] Номер задания 5540.

s11kai: MrAndrewson пишет: F3303 = 3303 * F3302 + 1 = 3303*(3302 * F3301 + 1) + 1 = 3303* (3302 * (3301 * F3300 + 1) + 1) + 1 = 3303* 3302 * 3301 * F3300 + 3303 * 3302 + 3303 + 1 = ... Не сократится это по-хорошему.. Зачем не сократиться, а если так: f(3303) = 3303*f(3202)+1 f(3302) = 3302*f(3301)+1 f(3301) = 3301*f(3300)+1 f(3300) = 3300*f(3299)+1 F(3303) / F(3300) = (3303*3302*3301*3300*f(3299)+1)/(3300*f(3299)+1) = 36 002 376 306

s11kai: MrAndrewson пишет: Задача не на ручное решение, видимо. Динамикой на питоне прекрасно решается. Можно и так: [pre2] import sys sys.setrecursionlimit( 10000 ) def f( n ): if n == 1: return 1 else : return n*f(n-1) +1 print( f(3303) // f(3300) ) # или даже так: x = 1 for n in range(3303, 3300, -1): x *= n print( x ) [/pre2]


vun: спасибо большое



полная версия страницы