English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python базовый курс

Python управление потоком

Функции Python

Типы данных Python

Python файловые операции

Python объекты и классы

Python дата и время

Python продвинутые знания

Python справочник

Рекурсия (Recursion) в Python

В этой статье вы узнаете, как создавать рекурсивные функции (функции, которые вызывают себя).

Что такое рекурсия в Python?

Рекурсия — это процесс определения чего-либо на основе себя.

Пример из физического мира —放置两个面对面相对的平行镜。Любой объект между ними будет рекурсивно отражаться.

Python рекурсивная функция

В Python我们知道ФункцияМожно вызывать другие функции. Функция может даже вызывать себя. Этот тип структур называется рекурсивной функцией.

Ниже приведен пример рекурсивной функции для нахождения факториала целого числа.

Факториал числа — это произведение всех целых чисел от 1 до этого числа. Например, факториал 6 (представленный как 6!) равен1 * 2 * 3 * 4 * 5 * 6 = 720

Пример рекурсивной функции

def calc_factorial(x):
    """
    Функция для вычисления целочисленного факториала
    if x == 1:
        возврат 1
    else:
        возврат (x * calc_factorial(x-1))
num = 4
print("The factorial of", num, "is", calc_factorial(num))

В предыдущем примере calc_factorial() является рекурсивной функцией, которая вызывает себя.

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

Каждая функция умножает число на факториал следующего за ним числа, пока не достигнет 1. Это рекурсивный вызов можно объяснить следующим образом.

calc_factorial(4) # 1st call with 4
4 * calc_factorial(3) # 2nd call with 3
4 * 3 * calc_factorial(2) # 3rd call with 2
4 * 3 * 2 * calc_factorial(1)  # 4-й вызов с number=1
4 * 3 * 2 * 1                   # возврат из 4-го вызова, как number=1
4 * 3 * 2                       # возврат из 3-го вызова
4 * 6                           # возврат из 2-го вызова
24                             # возврат из 1-го вызова

Рекурсия заканчивается, когда число уменьшается до 1. Это называется базовым условием.

Каждая рекурсивная функция должна иметь базовое условие остановки рекурсии,否则 функция будет бесконечно вызывать себя.

Интерпретатор Python ограничивает глубину рекурсии, чтобы помочь избежать бесконечной рекурсии, что может привести к переполнению стека.

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

def recursor():
    recursor()
recursor()

Результат вывода

Traceback (последний вызов в начале):
  Файл "<string>", строка 3, в <module>
  Файл "<string>", строка 2, в a
  Файл "<string>", строка 2, в a
  Файл "<string>", строка 2, в a
  [Предыдущая строка повторена 996 раз]
RecursionError: максимальная глубина рекурсии превышена

Преимущества рекурсии

  1. Рекурсивные функции делают код чистым и опрятным.

  2. Использование рекурсии позволяет разбивать сложные задачи на более простые подзадачи.

  3. Использование рекурсии легче генерировать последовательности по сравнению с использованием вложенных вложений.

Недостатки рекурсии

  1. Иногда логика, стоящая за рекурсией, трудно следить.

  2. Рекурсивные вызовы дорогие (низкая эффективность), так как они занимают много памяти и времени.

  3. Рекурсивные функции трудно отладить.