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

Рекурсия: полезное руководство в Python

Чтобы понять рекурсию, вам сначала нужно понять рекурсию (Стивен Хокинг)

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

Рекурсия – это мощный инструмент в вашем кодировании. Понимание это ключевой навык на вашем пути, чтобы овладеть. Эта статья дает вам тщательное введение в эту важную концепцию компьютерных наук.

  • Что такое рекурсия?
  • Какой простой пример для рекурсии?
  • Что такое взаимная рекурсия?

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

Стивен Хокинг использовал краткое объяснение: «Чтобы понять рекурсию, нужно сначала понять рекурсию».

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

Вы создаете рекурсивную функцию F Четыре шага:

  1. Разбить оригинальную проблему в меньшие случаи проблем,
  2. Возьмите меньшие проблемы проблем как вход функции F (который затем сломает меньший ввод в даже меньшие случаи проблем и так далее),
  3. Определите «базовый случай», который является наименьшим возможным входом, который можно решить напрямую без какого-либо дополнительного вызова функции F , и
  4. Укажите, как вы можете рекомбинировать полученные меньшие решения в более широкий раствор.

Какой простой пример для рекурсии?

Рассмотрим факториальную функцию, которая рассчитывает продукт всех чисел до номера N:

f(5) = 5 * 4 * 3 * 2 * 1 = 120
f(4) = 4 * 3 * 2 * 1 = 24
f(3) = 3 * 2 * 1 = 6

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

Рекурсивное определение факториальной функции демонстрирует важный элемент рекурсии: каждое определение рекурсивного функции должно указать

  • Как определяется корпус рекурсионного база и
  • Как получить решение большей проблемы от меньшей проблемы.

Это определение показывает, что Базовый чехол факториальной функции появляется для. Факториал 1 составляет 1: нет необходимости действовать с рекурсией.

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

Вот как выглядит рекурсивный фактор в коде Python:

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


for i in range(10):
    print(factorial(i))


"""
Output:
1
1
2
6
24
120
720
5040
40320
362880
"""

Скажем, вы уже нашли решение факториала N-1. Теперь легко найти факториал N, просто умножаясь с фактором N-1. Чтобы предотвратить рекурсию наверждаться навсегда, мы определяем базовый случай для N <2.

Что такое взаимная рекурсия?

Взаимная рекурсия возникает, если функция A () вызывает функцию B () – и функцию B (), вызывает функцию A (), чтобы найти решение.

Другими словами, функции a () и b () взаимозависимы.

Вот пример:

def ping(i):
    if i>0:
        return pong(i-1)
    return "0"

def pong(i):
    if i>0:
        return ping(i-1)
    return "1"
    
print(ping(29))

Головоломка: какая вывод этого кода фрагмент?

Эта головоломка дает пример для взаимной рекурсии: функция Ping вызывает функцию PONG, которая вызывает функцию Ping. Каждый вызов функции решает немного простых проблем.

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

Это наименее сложные подпруты, и мы знаем их решения. Идея состоит в том, чтобы построить решение сложной задачи от решений подпороблем.

Поэтому, когда вы называете Ping (29), функция Ping уменьшает этот вопрос к PONG (28) – более легкая проблема. Вызывая функция Ping ждет Pong, чтобы вернуть решение. Но понг просит обратно пинг (27) и ждет решения. На более высоком уровне Ping получает нечетные значения и понциальные значения аргумента для начального ввода. Таким образом, последний вызов является PONG (0), который возвращает 1. Каждая функция вызова ждет результата вызываемой функции. Каждая функция вызовов получает значение 1 и возвращает его к его родительской функции вызова. Наконец, максимально-функциональный экземпляр Ping (29) возвращает значение 1 в качестве конечного результата.

Похожие видео – Python Kata на рекурсии

Вы также можете посмотреть это видео, когда Creator Crement Crement решает Python Kata, используя некоторые понятия, извлеченные в этой статье.

Куда пойти отсюда?

Статья дала вам краткое введение в рекурсию (и взаимную рекурсию), используя простые примеры.

Примеры взяты из моей книги «Кофе-брейк Python», который преподает вам все важные концепции и функции, которые вам нужно знать, чтобы начать работу с Python.

Получите книгу на Amazon!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

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