@slump192

Почему не выводит результат кода на рекурсию для ЕГЭ 16 задания?

программа компилируется, но не выдаёт ответа. Я новичок и хотел бы узнать совета
сам код:
def f(n):
if n == 1: return 1
if n > 1: return n * f(n - 1)
print((f(2024) + f(2023)) / f(2022))
  • Вопрос задан
  • 346 просмотров
Решения вопроса 2
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
программа компилируется, но не выдаёт ответа.

Ну почему же не выводит, выводит, но вначале падает, все таки это самый медленный ЯП из популярных.
def f(n):
    print(f"Entering f({n})")
    if n == 1:
        print(f"Returning 1 for f({n})")
        return 1
    if n > 1:
        result = n * f(n - 1)
        print(f"Returning {result} for f({n})")
        return result

print((f(2024) + f(2023)) / f(2022))

console:
# python f.py
Entering f(2024)
...
Entering f(1037)
Entering f(1036)
Entering f(1035)
Entering f(1034)
Entering f(1033)
Entering f(1032)
Entering f(1031)
Entering f(1030)
Entering f(1029)
Entering f(1028)
Entering f(1027)
Entering f(1026)
Traceback (most recent call last):
  File "f.py", line 11, in <module>
    print((f(2024) + f(2023)) / f(2022))
           ^^^^^^^
  File "f.py", line 7, in f
    result = n * f(n - 1)
                 ^^^^^^^^
  File "f.py", line 7, in f
    result = n * f(n - 1)
                 ^^^^^^^^
  File "f.py", line 7, in f
    result = n * f(n - 1)
                 ^^^^^^^^
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

С#, console:
dotnet run
Entering F(2024)
...
Entering F(1)
Returning 1 for F(1)
...
Returning 7,257415615307994E+306 for F(170)
Returning ∞ for F(171)
...
Returning ∞ for F(2023)
Entering F(2022)
...
Entering F(1)
Returning 1 for F(1)
...
Returning 7,257415615307994E+306 for F(170)
Returning ∞ for F(171)
...
Returning ∞ for F(2022)
не число
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Данная формула
f(2024) + f(2023)) / f(2022))
написана правильно (as is) но является как-бы троллингом вычислительной системы.

В числителе и знаменателе считаются факториалы чисел с разрядностью больше чем RSA ключи.
От десятки и выше каждый множитель добавляет 2 десятичных знака к проивзедению и в конце
где вы ведете учет последних множителей идут 2000*2001*2002 и так далее. Каждое умножение
добавляет 3 нуля. Миллионы-миллиарды-триллионы и так далее.

Rsa97 пишет про это в комментарии. Собственно он и ответил на вопрос как это считать. Сократив
ненужные вычисления.

Python-у очень тяжело считать такие числа. Это - как майнинг. И самое смешное что математически,
формула очень сильно упрощается если по закону сокращения дробей.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@lnerim
Медленный питон, именно в данном случае, вообще ни при чём. Не тот пример, чтобы показать его медлительность.
Чтобы решить задачу, используйте библиотеку math
from math import factorial as f

print((f(2024) + f(2023)) / f(2022))

Либо пишите код, не использующий рекурсию, чтобы не выходить за рамки рекурсивных вызовов
def f(n):
    result = 1
    for i in range(2, n+1):
        result *= i
    return result


print((f(2024) + f(2023)) / f(2022))
Ответ написан
Комментировать
@inmel
На ЕГЭ, такие 16 задания следует решать аналитически, и в комментариях к вопросу был дан правильный ответ.
6646940d75083191455692.png
Еще вариант, снять ограничение в python на количество рекурсивных вызовов, по умолчанию =1000 ( а в нашей задаче 2025 вызовов рекурсии), сделать это можно добавив две строки в начало программы:
from sys import *
setrecursionlimit(2500)

Это плохая практика, но если хотите себя проверить с помощью кода на ЕГЭ, то можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы