Форум сайта python.su
0
Всем привет.
Имеется такая функция с рекурсией
def x(a): return x(a - 1) + x(a - 2) + 42 if a > 1 else a print '%r' % x(195)
Отредактировано bor1k_by (Апрель 21, 2016 18:28:26)
Офлайн
6
А задача какая вообще?
Офлайн
568
bor1k_byпревращать рекурсию в цикл без рекурсии, это же очевидно.
как быть,может кто подскажет
Офлайн
0
FishHookприходило в голову, даже так пробовал
def x(a): i=0 if a > 1: while i<=a: return (a - 1) + (a - 2) + 42 else: return a i=i+1 print x(195)
Офлайн
568
bor1k_by
как же я вас на мысль натолкну, когда вы не рассказываете что же функция должна сделать.
Офлайн
Одним из вариантом оптимального использования памяти данным скриптом является мемоизация (memoization) (т.е. сохранение результатов выполнения функции для предотвращения повторных вычислений).
Подробнее: https://en.wikipedia.org/wiki/Memoization
То есть вы должны завести список (либо словарь), в который будете заносить значения, которые уже вычислены вашей функцией. При следующем обращении к функции в том случае, если значение функции для вызываемого параметра уже было определено, вы просто достаете его из списка, иначе - вычисляете, используя уже определенные предыдущие значения.
Отредактировано flasky (Апрель 21, 2016 20:08:09)
Офлайн
0
FishHookвычислять большие значения аргументов,к примеру, взять результат от a=195
bor1k_byкак же я вас на мысль натолкну, когда вы не рассказываете что же функция должна сделать.
Офлайн
0
В общем сделал с помощью записи значения в словарь
memo={} def x(a): if a<=1:return a if not a in memo: memo[a]=x(a-1)+x(a-2)+42 return memo[a] print x(195)
Офлайн
857
bor1k_by
Не получается только то,что считает максимум для аргумента 30,дальше памяти ,я так понимаю, не хватает
>>> x(30) 57375296 >>> x(40) 7056700035 >>>
Офлайн