Какова максимальная глубина рекурсии в Python, и как увеличить его?

Используйте BehaviorSubject для userChangeSet. Он выдает значение сразу после подписки. Пример:

userChangeSet = new BehaviorSubject<any>(this.currentData);
352
задан Community 16 November 2019 в 06:22
поделиться

6 ответов

Да, это защита от переполнения стека. Python (или, скорее, реализация CPython) не оптимизирует хвостовую рекурсию, а необузданная рекурсия вызывает переполнение стека. Вы можете проверить предел рекурсии с помощью sys.getrecursionlimit и изменить ограничение рекурсии с помощью sys.setrecursionlimit , но это опасно - стандартный предел немного консервативен, но стековые кадры Python может быть довольно большим.

Python не является функциональным языком, и хвостовая рекурсия не является особенно эффективным методом. Как правило, лучше переписать алгоритм итеративно, если это возможно.

398
ответ дан 23 November 2019 в 00:24
поделиться

Мы можем сделать то использование @lru_cache декоратор и setrecursionlimit() метод:

import sys
from functools import lru_cache

sys.setrecursionlimit(15000)


@lru_cache(128)
def fib(n: int) -> int:
    if n == 0:
        return 0
    if n == 1:
        return 1

    return fib(n - 2) + fib(n - 1)


print(fib(14000))

Вывод

3002468761178461090995494179715025648692747937490792943468375429502230242942284835863402333575216217865811638730389352239181342307756720414619391217798542575996541081060501905302157019002614964717310808809478675602711440361241500732699145834377856326394037071666274321657305320804055307021019793251762830816701587386994888032362232198219843549865275880699612359275125243457132496772854886508703396643365042454333009802006384286859581649296390803003232654898464561589234445139863242606285711591746222880807391057211912655818499798720987302540712067959840802106849776547522247429904618357394771725653253559346195282601285019169360207355179223814857106405285007997547692546378757062999581657867188420995770650565521377874333085963123444258953052751461206977615079511435862879678439081175536265576977106865074099512897235100538241196445815568291377846656352979228098911566675956525644182645608178603837172227838896725425605719942300037650526231486881066037397866942013838296769284745527778439272995067231492069369130289154753132313883294398593507873555667211005422003204156154859031529462152953119957597195735953686798871131148255050140450845034240095305094449911578598539658855704158240221809528010179414493499583473568873253067921639513996596738275817909624857593693291980841303291145613566466575233283651420134915764961372875933822262953420444548349180436583183291944875599477240814774580187144637965487250578134990402443365677985388481961492444981994523034245619781853365476552719460960795929666883665704293897310201276011658074359194189359660792496027472226428571547971602259808697441435358578480589837766911684200275636889192254762678512597000452676191374475932796663842865744658264924913771676415404179920096074751516422872997665425047457428327276230059296132722787915300105002019006293320082955378715908263653377755031155794063450515731009402407584683132870206376994025920790298591144213659942668622062191441346200098342943955169522532574271644954360217472458521489671859465232568419404182043966092211744372699797375966048010775453444600153524772238401414789562651410289808994960533132759532092895779406940925252906166612153699850759933762897947175972147868784008320247586210378556711332739463277940255289047962323306946068381887446046387745247925675240182981190836264964640612069909458682443392729946084099312047752966806439331403663934969942958022237945205992581178803606156982034385347182766573351768749665172549908638337611953199808161937885366709285043276595726484068138091188914698151703122773726725261370542355162118164302728812259192476428938730724109825922331973256105091200551566581350508061922762910078528219869913214146575557249199263634241165352226570749618907050553115468306669184485910269806225894530809823102279231750061652042560772530576713148647858705369649642907780603247428680176236527220826640665659902650188140474762163503557640566711903907798932853656216227739411210513756695569391593763704981001125

Источник

functools lru_cache

0
ответ дан 23 November 2019 в 00:24
поделиться

Мы могли также использовать изменение динамического программирования, вверх дном приближаются

def fib_bottom_up(n):

    bottom_up = [None] * (n+1)
    bottom_up[0] = 1
    bottom_up[1] = 1

    for i in range(2, n+1):
        bottom_up[i] = bottom_up[i-1] + bottom_up[i-2]

    return bottom_up[n]

print(fib_bottom_up(20000))
0
ответ дан 23 November 2019 в 00:24
поделиться

Используйте язык, который гарантирует оптимизацию хвостового вызова. Или используйте итерацию. В качестве альтернативы, проявите симпатию с помощью декораторов .

17
ответ дан 23 November 2019 в 00:24
поделиться

Это во избежание переполнения стека. Интерпретатор Python ограничивает глубину рекурсии, чтобы помочь вам избежать бесконечных рекурсий, приводящих к переполнению стека. Попробуйте увеличить предел рекурсии (sys.setrecursionlimit) или переписать код без рекурсии.

с веб-сайта python :

sys.getrecursionlimit ()

Возвращает текущее значение ограничения рекурсии, максимальную глубину стека интерпретатора Python. Этот предел не позволяет бесконечной рекурсии вызывать переполнение стека C и сбой Python. Его можно установить с помощью setrecursionlimit ().

50
ответ дан 23 November 2019 в 00:24
поделиться

Похоже, вам просто нужно задать большую глубину рекурсии:

import sys
sys.setrecursionlimit(1500)
112
ответ дан 23 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: