Рубрики
Без рубрики

Рекурсия в Python Programming

Узнайте о рекурсии в Python Programming. Рекурсия является фундаментальной концепцией в компьютерных науках и программировании Python.

Автор оригинала: Robin Andrews.

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

Темы охватывали:

  • Основная концепция рекурсии
  • Что такое базовый случай?
  • Некоторые примеры рекурсивных алгоритмов
  • Визуализация рекурсии

С точки зрения повседневного развития, сумма, которую вы используете рекурсию, будут варьироваться в зависимости от контекста. Некоторые разработчики могут сделать мало или нет явное использование IT, пока для других это будет основой. Независимо от того, рекурсия является частью самой ткани вычислений, и даже если вы не используете его явно в своей повседневной работе, вы можете поспорить, что это происходит много всего за кулисами.

Вот несколько примеров того, где рекурсия используется в вычислениях:

  • пересекающий DOM элементы
  • Обработка рекурсивно определяемых данных, таких как хранятся на деревьях
  • команда снарядов
  • Компиляторы и линкеры
  • Оценка арифметических выражений
  • Системы баз данных

Рекурсия настолько важна и полезна, что почти все современные языки программирования его поддерживают.

Так что такое рекурсия?

Вероятно, лучше посмотреть на пример сначала, а затем нарушать его, чтобы объяснить, что происходит.

Пример рекурсивного алгоритма в Python

Введите этот код в новый файл Python.

def countdown(n):
  if n <= 0:
    print("LIFTOFF!")
  else:
    print(n)
    countdown(n - 1)

countdown(10)

Прежде чем запустить его, подумайте о том, что может быть вывод этой программы. Вы можете нажать ниже, чтобы увидеть решение.

10
9
8
7
6
5
4
3
2
1
LIFTOFF!

Что здесь происходит? Хотя это простая программа, она содержит фундаментальные ингредиенты рекурсии:

Базовый вариант

Базовый чехол имеет важное значение с рекурсией. Без этого алгоритм не будет никакого способа «знать», когда остановиться. Не надо иметь Пока правда Loop – I.e. Вы получаете бесконечный цикл, за исключением рекурсии, вы в конечном итоге ударите максимальный предел рекурсии вашей системы. Здесь базовый случай – когда N Отказ

Движение к базовому случаю

Алгоритм должен подойти к базовому случаю на каждом последовательном вызове, в противном случае он не может расторгнуть. Опять сравнивая это с в то время как Цикл, не двигаясь к базовому корпусу, это все равно, чтобы не двигаться к условию для цикла во время выхода. Каждый последовательный звонок здесь имеет N - 1 Как его аргумент, поэтому мы приближаемся к базовому делу. Это хорошо.

Рекурсивный звонок

Простая, но мощная идея вот в том, что определение функции содержит вызов к себе в его теле. Вы заметили, что определение функции для Обратный отсчет () Содержит вызов функции Обратный отсчет () ?

Этапы рекурсии

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

Это, вероятно, лучше всего иллюстрировано визуально. Посмотрите на это представление вызова к факториал (n) Функция, которая рассчитывает продукт уменьшения значений N а чья математический символ – ! Отказ Например 5! * 4 * 3 * 2 * 1

def factorial(n):
   if n == 1:
       return 1
   else:
       return n * factorial(n-1)

print(factorial(5))

Вот что происходит до окончательной стоимости 120 возвращается и напечатан:

|-- factorial(5)
|  |-- factorial(4)
|  |  |-- factorial(3)
|  |  |  |-- factorial(2)
|  |  |  |  |-- factorial(1)
|  |  |  |  |  |-- return 1
|  |  |  |  |-- return 2
|  |  |  |-- return 6
|  |  |-- return 24
|  |-- return 120
120
>>>

факториал (5) звонки факториал (4) который звонит факториал (3) etc, пока не будет достигнут базовый чехол ( n ), то каждая из вызовов функций возвращает его значение, в обратном порядке, в котором они были вызваны, до значения для начального вызова факториал (5) возвращается.

Мы можем использовать такую же диаграмму для нашего первого примера рекурсивного алгоритма, Обратный отсчет (N) Хотя это менее понятно, что происходит, так как ничего не происходит (на самом деле None ) возвращается каждым последовательным вызовом функций, поскольку мы используем Печать выводить значение для каждого этапа подсчета.

|-- countdown(5)
5
|  |-- countdown(4)
4
|  |  |-- countdown(3)
3
|  |  |  |-- countdown(2)
2
|  |  |  |  |-- countdown(1)
1
|  |  |  |  |  |-- countdown(0)
LIFTOFF!
|  |  |  |  |  |  |-- return None
|  |  |  |  |  |-- return None
|  |  |  |  |-- return None
|  |  |  |-- return None
|  |  |-- return None
|  |-- return None
None

Как освоить рекурсию в Python

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

Счастливые вычисления!