Wolfram|Alpha определяет рекурсию следующим образом: «Рекурсивный процесс — это процесс, в котором объекты определяются в терминах других объектов того же типа. Используя своего рода рекуррентное соотношение, весь класс объектов может быть построен из нескольких начальных значений и небольшого количества правил. Числа Фибоначчи чаще всего определяются рекурсивно. Однако следует соблюдать осторожность, чтобы избежать саморекурсии, при которой объект определяется в терминах самого себя, что приводит к бесконечной вложенности». В математике факториалы часто используются для объяснения концепции рекурсии. Факториал - это произведение заданного целого числа и всех целых чисел под ним; то есть факториал четыре (4!) = 24.

В компьютерных науках рекурсия — это практика решения проблемы, когда решение зависит от решений более мелких экземпляров той же проблемы. Это может показаться запутанным, поэтому давайте сузим это определение более конкретно до терминов программирования. Обычно мы используем рекурсию в рамках функции. Основываясь на приведенном выше определении, рекурсивная функция — это функция, которая будет вызывать себя прямо или косвенно до тех пор, пока не будет достигнут желаемый результат, основанный на аргументах, переданных в рекурсивную функцию.

Давайте применим то, что мы уже узнали, к коду Python, чтобы лучше его рассмотреть. Мы уже знаем, что в Python мы можем создать функцию, которая может вызывать другие функции. Также возможно, что функция вызывает сама себя — это то, что мы называем рекурсивными функциями. Как я упоминал ранее, факториал числа — это произведение всех целых чисел от 1 до N-го числа. Факториалы в математике записываются в виде числа, до которого нужно построить, за которым следует восклицательный знак. Таким образом, факториал 6 будет записан как 6! а на бумаге будет 1 * 2 * 3 * 4 * 5 * 6 = 720.

Давайте посмотрим на пример, написанный на Python, чтобы найти факториал заданного параметра:

def calculate_factorial(n):
    # Handle first if n is 1
    if n == 1:
        return 1
    else:
        # Decrement n for each number in the factorial
        return n * calculate_factorial(n - 1)
num = 6
print(f"The factorial of {num} is {calc_factorial(num)}")

В этом примере мы видим, что, поскольку calculate_factorial() вызывает саму себя в операторе else, calculate_factorial() является рекурсивной функцией. Когда мы вызываем эту функцию, используя положительное целое число для n, она будет рекурсивно вызывать себя, уменьшая число на 1. Каждый вызов функции будет умножать n на факториал числа 1 до тех пор, пока n не станет равным 1, что мы установили в качестве нашего базового условия. . Важно отметить, что каждая рекурсивная функция ДОЛЖНА иметь базовое условие, задача которого состоит в том, чтобы остановить рекурсию, иначе функция будет вызывать себя бесконечно.

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

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

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