English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете, как создавать рекурсивные функции (функции, которые вызывают себя).
Рекурсия — это процесс определения чего-либо на основе себя.
Пример из физического мира —放置两个面对面相对的平行镜。Любой объект между ними будет рекурсивно отражаться.
В 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: максимальная глубина рекурсии превышена
Рекурсивные функции делают код чистым и опрятным.
Использование рекурсии позволяет разбивать сложные задачи на более простые подзадачи.
Использование рекурсии легче генерировать последовательности по сравнению с использованием вложенных вложений.
Иногда логика, стоящая за рекурсией, трудно следить.
Рекурсивные вызовы дорогие (низкая эффективность), так как они занимают много памяти и времени.
Рекурсивные функции трудно отладить.