Как увеличить глубину рекурсии в python
Перейти к содержимому

Как увеличить глубину рекурсии в python

  • автор:

Рекурсия в Python, примеры кода

Python поддерживает рекурсию, когда функция может вызывать саму себя. На глубину вложения рекурсивных вызовов наложены ограничения. По умолчанию Python прерывает рекурсию и бросает исключение RecursionError , если обнаруживает, что глубина стека рекурсивных вызовов превысила 1000. Для этого предела можно установить другое значение с помощью функции setrecursionlimit() модуля sys .

Однако возможность изменения рекурсивного предела не означает, что вы можете сделать его сколько угодно большим. Абсолютное максимальное значение этого предела зависит от платформы, на которой выполняется программа. Максимальное значение рекурсивных вызовов можно посмотреть с помощью sys.getrecursionlimit() . В типичных случаях вы можете рассчитывать на рекурсию глубиной порядка нескольких тысяч уровней. При чрезмерно большой установленной глубине рекурсивных вызовов программа может завершиться аварийно. Такие выходящие из-под контроля рекурсии, являются одной из немногих причин возможного краха программы на Python, когда не срабатывает даже обычный защитный механизм исключений Python. Поэтому «НЕ ЛЕЧИТЕ» программу, в которой возникает исключение RecursionError , путем повышения разрешенной глубины вложения рекурсивных вызовов с помощью функции sys.setrecursionlimit(n) . В таких случаях лучше изменить организацию программы таким образом, чтобы избавиться от рекурсии или хотя бы постараться уменьшить глубину вложения рекурсивных вызовов.

Рекурсию в Python рассмотрим на примере решения факториала, функции, определённой на множестве неотрицательных целых чисел. Например 5! = 1 * 2 * 3 * 4 * 5 = 120

def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) x = factorial(5) print(x) # 120 
Наглядный пример работы рекурсии:
def countDown(start, indent=0): print('-'*indent, '>', start) start = start - 1 indent = indent + 1 if start >= 0: # Рекурсивный вызов 'countDown', в которой # происходит печать строки, но только уже с # другими значениями, которые вычисляются выше countDown(start, indent) countDown(5, 2) # -- > 5 # --- > 4 # ---- > 3 # ----- > 2 # ------ > 1 # ------- > 0 
Еще нагляднее:
def countDown(start, indent=1): print('-'*indent, 'UP:', start) if start == 0: # Здесь рекурсивный вызов 'countDown' прекратился, сначала # печатается эта строчка, потом все, что было накоплено в стеке. print('-'*indent, 'DOWN:', start) else: # Рекурсивный вызов 'countDown' countDown(start - 1, indent + 1) # Вызов 'countDown' не дает функции print выполнится # и накапливает (откладывает) ее исполнение в стеке print('-'*indent, 'DOWN:', start) countDown(5) # - UP: 5 # -- UP: 4 # --- UP: 3 # ---- UP: 2 # ----- UP: 1 # ------ UP: 0 # ------ DOWN: 0 # ----- DOWN: 1 # ---- DOWN: 2 # --- DOWN: 3 # -- DOWN: 4 # - DOWN: 5 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Функции это объекты
  • Функции могут иметь атрибуты
  • Функции могут храниться в структурах данных
  • Функции могут быть вложенными
  • Передача функции в качестве аргумента другой функции
  • Область видимости переменных функции
  • Операторы global и nonlocal
  • Параметры (аргументы) функции
  • Ключевые аргументы в определении функции Python
  • Значение аргумента по умолчанию в функциях Python
  • Варианты передачи аргументов в функцию Python
  • Переменные аргументов *args и **kwargs в функции Python
  • Распаковка аргументов для передачи в функцию Python
  • Как оцениваются аргументы при вызове функции?
  • Строгие правила передачи аргументов в функцию Python
  • Инструкция return
  • Анонимные функции (lambda-выражения)
  • Строки документации в функциях Python
  • Рекурсия
  • Замыкания в функциях Python
  • Перегрузка функций

Как исправить ошибку ‘Превышена максимальная глубина рекурсии’

У меня есть код для ЕГЭ. Задания с 19 по 21. Я написал код для этих заданий, но при запуске кода выдает ошибку RecursionError: maximum recursion depth exceeded. Я целый день искал ошибку, гуглил в интернете , но ничего не нашел. Знатоки помогите пожалуйста.

from functools import lru_cache def xodi(h): a,b = h return (a+1,b),(a,b+1),(a*4,b),(a,b*4) @lru_cache(None) def game(h): a,b = h if a + b >= 310: return 'W' if any(game(m)== 'W' for m in xodi(h)): return 'P1' if any(game(m)== 'P1' for m in xodi(h)): return 'B1' if any(game(m)== 'B1' for m in xodi(h)): return 'P2' if all(game(m)== 'P2' or game(m)== 'P1' for m in xodi(h)): return 'B2' for s in range(1, 101): h = (16, s) if game(h) is not (None): print(s, game(h)) 

введите сюда описание изображения

Вот собственно самое задание, прошу именно решить по моему коду, не писать новый.

Отслеживать
задан 29 апр 2022 в 13:09
3 1 1 серебряный знак 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

import sys sys.setrecursionlimit(2000) # по умолчанию стоит 1000 

Это увеличивает возможную глубину рекурсии до конкретного значения

Отслеживать
ответ дан 29 апр 2022 в 13:13
RuslanZanevskiy RuslanZanevskiy
610 3 3 серебряных знака 7 7 бронзовых знаков
Ну и как собственно мне это поможет?
29 апр 2022 в 13:30
При указании рекурсии 10000, то ничего не происходит
29 апр 2022 в 13:31

Да? Я копировал ваш код, ставил 2000 и уменя все прекрасно работало. Как это поможет? Мы увеличили допустимый лимит вызовов функции в глубину.

29 апр 2022 в 13:34
Вставляйте этот код перед вызовом всех функций(в начале файла)
29 апр 2022 в 13:34

Мне кажется если вы используете рекурсию вы понимаете что функция вызывает сама себя много раз из-за чего тратиться память стэка вызовов, поэтому такое поведение и ограничивается. Кстати StackOverflow с английсткого и есть переполнение стэка.

Как увеличить глубину рекурсии в python

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Настройка рекурсии в Python

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

sys.setrecursionlimit(limit) :

Функция sys.setrecursionlimit() устанавливает максимальную глубину стека интерпретатора Python для ограничения. Этот предел предотвращает бесконечную рекурсию от переполнения стека языка C и сбоя Python.

Максимально возможный предел зависит от платформы. Пользователю может потребоваться установить более высокий предел, если у него есть программа, которая требует глубокой рекурсии и платформа, которая поддерживает более высокий предел. Это следует делать с осторожностью, так как слишком высокий лимит может привести к сбою.

Если новый предел глубины стека слишком низкий на текущей глубине рекурсии, возникает исключение RecursionError .

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

  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • События аудита CPython
  • Функция argv модуля sys
  • Имя используемой OS
  • Различные сведения о версии Python
  • Каталоги и пути интерпретатора Python
  • Кодировка, используемая Python
  • Настройка рекурсии
  • Функции трассировки и профилирования кода модуля sys
  • Функция breakpointhook() модуля sys
  • Объекты stdin, stdout, stderr модуля sys
  • Функции exc_info() и exception() модуля sys
  • Функция getrefcount() модуля sys
  • Атрибуты path и path_hooks модуля sys
  • Список загруженных и скомпилированных модулей
  • Атрибут float_info модуля sys
  • Атрибут int_info модуля sys
  • Атрибут maxsize модуля sys
  • Атрибут byteorder модуля sys
  • Функция exit() модуля sys
  • Функция getsizeof() модуля sys
  • Атрибут dont_write_bytecode модуля sys
  • Функция warnoptions() модуля sys
  • Переменные last_type, last_value, last_traceback
  • Переменная sys.last_exc модуля sys
  • Функция set_asyncgen_hooks() модуля sys
  • Функция get_coroutine_origin_tracking_depth() модуля sys

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *