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

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

Привет инженеры сегодня, я расскажу о рекурсии в чем, почему и как. Что … с меткой питона, алгоритмов, программирования, новичков.

Привет, инженеры

Сегодня я расскажу о рекурсии в чем, почему и как. Что такое рекурсия, зачем его использовать и как решить проблемы с ним. Примеры будут в Python, так как Python легко понять и близко к алгоритмам.

Может начнем ?

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

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

Зачем использовать рекурсию?

Я выбираю этот вопрос над «когда использовать рекурсию», потому что многие ученики, которые изучали рекурсию, хотели знать, почему использовать его, так как все проблемы, которые мы можем решить в рекурсии, мы также можем решить его в нормальных итерационных петлях! Итак, вот мой ответ:

1- Рекурсия обучения делает вас лучшим программистом:

Обучение и практика рекурсии помогают вам улучшить свои навыки решения проблем, потому что вы узнаете, как разбить проблемы с небольшими. Кроме того, вы изучите принцип стека в структуре данных (стек – это абстрактный тип данных, который содержит упорядоченную линейную последовательность элементов), принцип LIFO (последний в первом месте) и как использовать стек вызовов Анкет

2- Использование рекурсии делает код более ясным:

Код рекурсии проще и короче, чем итеративный код. Функция рекурсии будет записана в меньшем количестве строк кода и будет проще для отладки.

3- Рекурсия- лучший друг структуры данных:

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

Как писать рекурсивные функции?

Перед написанием рекурсивной функции давайте поговорим о нескольких факторах, которые должны быть определены:

1- Определите коэффициент размера:

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

2- Определите базовый случай/s:

Базовой причиной может быть одно или несколько значений в зависимости от вашей программы. Я буду использовать цикл WING здесь, чтобы объяснить базовый случай.

def display_hello(i):
    while(i > 0):
        print("hello world")
        i -=1

Базовая причина определяет, когда петля остановится. В нашем примере базовая причина заключается в том, что когда значение I становится нулевым, цикл сломается и останавливается.

Базовый случай в рекурсии – это конкретное значение, которое, если мы достигнем, мы хотим прекратить вспоминать функцию и начать удаление и выполнение каждой функции в стеке вызовов.

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

3- Определите общий случай/s: Общая причина – это та, где проблема, выраженная как небольшая версия самой самой. Это означает, что программа будет продолжать итерацию общие причины, пока не достигнет базы причина

В нашем примере выше, если рассматривать как базовую причину, и мы отправляем 5 в качестве параметра, мы можем придумать:,,, и как об общих причинах.

Теперь давайте напишем рекурсивную функцию и проследите ее, используя предыдущую проблему:

Мы хотим написать функцию, которая пишет «Hello World» 3 раза:

Давайте проанализируем проблему:

Функция проверит базовую причину, если текущий корпус не соответствует базовой причине, тогда функция вызовет себя один раз. Таким образом, увеличение – это лайнер (это может быть O (n)) (Это, вероятно, будет безопасно для размера стека вызовов) Давайте попробуем написать нашу функцию сейчас, используя наш пример цикла

1- Базовая причина ->

def display_hello(i):
   if i>0:

2- Команда печати -> print (“Hello World”)

def display_hello(i):
   if i>0:
       print("hello world")

3- Изменения в каждой итерации -> Чтобы отправить новое значение переменной в следующий вызов функции, мы должны написать ее как параметр

def display_hello(i):
   if i>0:
       print("hello world")
       display_hello(i-1)

И это все для этой маленькой проблемы .. Прежде чем прослеживаться, давайте добавим одну команду печати после вызова функции и покажем результат в конце, чтобы сделать трассировку более интересной

Предполагая, что первым призывом был:

display_hello(3)

И наша функция:

def display_hello(i):
    if i > 0:
        print("hello world!")
        display_hello(i-1)
        print(f'The i value is {i}')

Теперь мы будем проследить это.

В первом вызове функция войдет в стек вызовов

Затем программа выполнит команды:

Когда выполнение достигнет строки 4 (отзыв функции), оно остановится на этом (оно приостановит выполнение команд REST) и добавит другую функцию в стек:

Затем программа выполнит команды во второй повторной функции:

Опять же, когда выполнение достигнет строки 4 (отзыв функции), оно остановится на этом (оно приостановит выполнение команд REST) и добавит другую функцию в стек:

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

Теперь, наконец, параметр равен 0, что является значением i

Выполнение начнется до строки 2, потому что условие говорит, что я должен быть больше нуля, но я равен нулю. Таким образом, мы достигли базовой причины, и мы не дойдем от отзыва «вызов» и Отпечатки

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

Теперь мы вернулись к предыдущей функции, когда параметр составлял 1, так что теперь программа выполнит остальную часть команды: s:

Функция теперь выполняется все команды, которые должны выполняться, время вытащить функцию из стека:

Теперь мы вернулись к функции, что ее параметр – два, и мы выполним остальные команды:

Опять же, после того, как мы выполнили выполнение, мы удалим функцию из стека:

Теперь у нас есть первый вызов, который 3 был его параметром, и мы выполним остальные команды:

И здесь последняя функция выскочит из стека, и стек вызовов станет пустым, и вот конец нашей программы:

Давайте проверим, была ли наше отслеживание правильным, выполнив код:

Итак, здесь мы достигаем конца сегодняшней статьи

Счастливой рекурсии 😁

Счастливой рекурсии 😁

Счастливой рекурсии 😁

Счастливой рекурсии 😁
Счастливой рекурсии 😁

Автор Примечание:

Я не использовал Fibonacci в качестве примера, потому что я считаю, что это не хороший пример для обучения рекурсии и рекурсии является одним из худших решений для решения Fibonacci с точки зрения как времени, так и пространства. Посмотреть эту статью Fibonacci без рекурсивности в Python – лучший способ

Рекомендации:

Оригинал: “https://dev.to/manarabdelkarim/why-and-how-to-solve-iterative-problems-recursively-the-smart-coding-4nj2”