Форум » Рекурсивные процедуры и функции » 3136 (вариант 373) » Ответить

3136 (вариант 373)

AnnaPershina: Подскажите,пожалуйста,что не так в решении. Определите наименьшее значение n, при котором сумма чисел, которые будут выведены при вызове F(n), будет больше 3200000. Запишите в ответе сначала найденное значение n, а затем через пробел – соответствующую сумму выведенных чисел. В ответе N=46 . но если я подставляю 46, то у меня сумма числен всего 2187 [pre2] Если увеличить интервал, то выдает ответ 1787 3200497 from functools import * @lru_cache(None) def F(n): global a a.append(n-5) if n > 1: a.append(n+8) F(n-2) F(n-3) return a a=[] for n in range(1,1000): F(n) if sum(a)>3200000: print(n,sum(a)) [/pre2]

Ответов - 5

Поляков: Уберите кэширование. Для меня такой эффект оказался неожиданным... И массив тут не нужен: [pre2] def F(n): global s s += n - 5 if n > 1: s += n + 8 F(n-2) F(n-3) for n in range(1,100): s = 0 F(n) if s > 3200000: print(n, s) break[/pre2]

AnnaPershina: Без кэширования программа не работала корректно

cabanov.alexey: Ну вообще ничего неожиданного. Состояние рекурсии не сохраняется в ней, а делегируется в глобальный список. В таком случае алгоритм сработает корректно только при полном прохождении по всем ветвям рекурсии. Вам нужно переписать рекурсию по другому. [pre2] from functools import * @lru_cache(None) def F(n): s = n-5 if n > 1: s+= n+8 + F(n-2) + F(n-3) return s[/pre2]


AnnaPershina: Поняла. Спасибо большое!

AnnaPershina: Без кэшироваания выдает 11, с кэшированием ответ верный



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