Форум » Рекурсивные процедуры и функции » (№ 5604) (А. Куканова) » Ответить

(№ 5604) (А. Куканова)

Ar3turrr: Условие записано неправильно. Ответ выходит только при делении нацело: F(n) = 2 · F(n + 1) // (n + 1), если 1 ≤ n < 5000 [pre2]def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4))[/pre2]

Ответов - 7

Поляков: Вы удивитесь. Математически там всегда деление нацело. А вот решение: [pre2]print( 1000*5*6*7 / (2*2*2) ) [/pre2]

Ar3turrr: Подразумевалось, что ответ выходит при замене / в условии на //, то есть на деление с округлением к наименьшему. (№ 5604) (А. Куканова) Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(n) = n!, если n ≥ 5000, F(n) = 2 · F(n + 1) / (n + 1), если 1 ≤ n < 5000. Чему равно значение выражения 1000 · F(7) / F(4)? Иначе, если написать код по предложенным условиям, то он будет выдавать ошибку: [pre2]def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) / (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4))[/pre2] Вывод к программе: [Previous line repeated 997 more times] OverflowError: integer division result too large for a float [pre2]def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4))[/pre2] Вывод к программе: 26250.0

Поляков: Ar3turrr пишет: Подразумевалось, что ответ выходит при замене / в условии на //, то есть на деление с округлением к наименьшему. Да, потому что разделив не нацело (/) вы разу перешли к вещественным числам и потеряли в точности. И вся длинная арифметика Питона уже не работает.


bolgova23: У меня при проверке Вашей программы ..... if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) .... выводит Process finished with exit code -1073741571 (0xC00000FD) В чем ошибка, подскажите пожалуйста

Ar3turrr: bolgova23 пишет: if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) Вероятно, это из-за отсутствия отступов.

Анна23: Здравствуйте, Константин Юрьевич! Подскажите, пожалуйста, как мы должны прийти к такому решению?

Поляков: Анна23 пишет: Подскажите, пожалуйста, как мы должны прийти к такому решению? Вручную. Если вы видите, что в задаче большие числа или получается слишком большое число рекурсивных вызовов, это намек на то, что решать ее нужно на бумаге. Или динамическим программированием, если на бумаге не получилось. Но тут - точно на бумаге, особенно если в языке программирования нет длинной целочисленной арифметики.



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