Найти в Дзене
МОЙ РЕПЕТИТОР

ПОЛНЫЙ ГАЙД ПО РЕКУРСИВНЫМ ФУНКЦИЯМ В PYTHON: ЧАСТЬ 2

❗ПЕРЕД ПРОЧТЕНИЕМ НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ОЗНАКОМИТЬСЯ С ПЕРВОЙ ЧАСТЬЮ МАТЕРИАЛА ⤵ 🚩В ПЕРВОЙ ЧАСТИ ⇪ материала были рассмотрены следующие темы: → Следующий этап — научиться разрабатывать рекурсивные функции в Python ⤵ 👉 Для создания рекурсивной функции в Python необходимо воспользоваться следующим определением: Рекурсивная функция — это функция, которая вызывает саму себя. → Попробуем создать рекурсивную функцию, руководствуясь данным ⇪ определением Нужно вспомнить алгоритм создания функции в Python, который был описан ранее в этой статье ⤵ → Создадим функцию def и назовём её INF. Чтобы функция вызвала саму себя, запишем функцию INF внутри функции INF. Далее необходимо вызвать функцию в основной программе и запустить код 🔥 После запуска появляется данная ошибка: ❌ RecursionError: maximum recursion depth exceeded — «Ошибка рекурсии: превышена максимальная глубина рекурсии» — Функция вызывает саму себя слишком много раз (или бесконечно ♾), и Python останавливает выполнение, так как па
Оглавление

❗ПЕРЕД ПРОЧТЕНИЕМ НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ОЗНАКОМИТЬСЯ С ПЕРВОЙ ЧАСТЬЮ МАТЕРИАЛА ⤵

🚩В ПЕРВОЙ ЧАСТИ ⇪ материала были рассмотрены следующие темы:

  • Что такое функция и как создать функцию в Python
  • Оператор return и его роль в функциях
  • Примеры многократного вызова функции
  • Основное определение рекурсивной функции и её смысл

Следующий этап — научиться разрабатывать рекурсивные функции в Python

СОЗДАНИЕ РЕКУРСИВНОЙ ФУНЦИИ В PYTHON

-2

👉 Для создания рекурсивной функции в Python необходимо воспользоваться следующим определением:

Рекурсивная функция — это функция, которая вызывает саму себя.

→ Попробуем создать рекурсивную функцию, руководствуясь данным ⇪ определением

Нужно вспомнить алгоритм создания функции в Python, который был описан ранее в этой статье ⤵

→ Создадим функцию def и назовём её INF. Чтобы функция вызвала саму себя, запишем функцию INF внутри функции INF.

Далее необходимо вызвать функцию в основной программе и запустить код 🔥

-3

После запуска появляется данная ошибка:

RecursionError: maximum recursion depth exceeded «Ошибка рекурсии: превышена максимальная глубина рекурсии»

  • Что это значит?

— Функция вызывает саму себя слишком много раз (или бесконечно ♾), и Python останавливает выполнение, так как память компьютера ограничена.

Пример, демонстрирующий бесконечный вызов рекурсивной функции.
Пример, демонстрирующий бесконечный вызов рекурсивной функции.

⭐ Отлично! Значит нам удалось всё - таки создать рекурсивную функцию! Функция INF() вызывает саму себя (правда, слишком много раз 😳).

  • Как исправить бесконечный вызов рекурсивной функции?

— Записать условие для выхода (остановки) рекурсивной функции ⤵

-5

📍Условие остановки (условие выхода) — это условие, при котором функция перестаёт вызывать саму себя

РЕКУРСИВНАЯ ФУНКЦИИ С УСЛОВИЕМ ВЫХОДА

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

→ Создадим рекурсивную функцию four, которая будет обязательно содержать условие для остановки (выхода) из функции ↷

Создание рекурсивной функции (four) в Python, содержащей условие для остановки рекурсии.
Создание рекурсивной функции (four) в Python, содержащей условие для остановки рекурсии.

📍Далее рассмотрим работу данной программы шаг за шагом, уделяя внимание каждому этапу ⤵

1️⃣ШАГ ПЕРВЫЙ | Вызов функции

На данном этапе Python должен осуществить вызов функции four

Важный момент:

При запуске программы Python читает код строку за строкой, сверху - вниз ↓ (но не всегда линейно)

-8

→ Первое, что встретит интерпретатор — строка def four(x), то есть объявление функции. Но, Python не выполнит запуск данной функции, так как она ещё не была вызвана в основной программе ⤵

Вызов функции (four) в основной программе.
Вызов функции (four) в основной программе.

→ Поэтому Python пропустит функцию four и перейдёт к коду, после функции → где как раз и записан вызов данной функции с аргументом х равным = 20.

  • four(20) — первая команда, которую выполнит Python
Схема вызовов рекурсивной функции (four).
Схема вызовов рекурсивной функции (four).

Что произойдёт после вызова функции four?

2️⃣ ШАГ ВТОРОЙ | Обработка функции

→ После вызова функции Python переходит к выполнению её тела (код внутри функции). В первую очередь определяется, какие аргументы принимает функция. В данном случае в неё передаётся только один аргумент — переменная x

Обработка функции (four).
Обработка функции (four).

3️⃣ ШАГ ТРЕТИЙ | Код внутри функции

→ Первая строчка кода внутри функции — оператор if

Оператор if проверяет заданное условие. Если условие истинно True, то выполняется определённый набор действий.

  • if x == 0: — если переменная х равна 0, то ...

В данный момент условие не выполнится, так как x = 20

-12

Следовательно, Python пропустит код внутри if и перейдёт к следующей строке →

4️⃣ ШАГ ЧЕТВЁРТЫЙ | Вывод (х) в консоль

После условия if записана команда print(x). Python выполнит эту команду и выведет текущее значение переменной х = 20 в консоль ⤵

-13

В результате данного шага на экране появится число — 20 →

5️⃣ ШАГ ПЯТЫЙ | РЕКУРСИЯ

💢Именно на этом шаге и произойдёт рекурсивный вызов функции (four)

→ После команды print Python перейдёт к следующей строке — four(x - 5)

Это и есть повторный вызов той же самой функции в теле функции ⤵

-14

→ В результате выполнения строки four(x - 5) произойдёт повторный вызов функции four, с аргументом х = 15.

Схема вызовов рекурсивной функции (four).
Схема вызовов рекурсивной функции (four).
Рекурсивная функция — это функция, которая вызывает саму себя.

❕ВАЖНЫЕ ВОПРОСЫ:

  • Почему (х) теперь равен 15?

— Так как текущее значение переменной х = 20, а в функцию передаётся параметр х - 5 следовательно: 20 - 5 = 15

  • Что произойдёт с функцией four, которая была вызвана в первый раз? Она исчезнет?

— Каждый рекурсивный вызов это новый, отдельный вызов функции со своим состоянием. Все они висят в стеке вызовов, ожидая завершения вложенного вызова ⤵

-16

🔒Python ограничивает размер стека (обычно ~1000 вызовов).

Стек вызовов (call stack) в Python — это структура данных, в которой Python хранит информацию о вызванных, но ещё не завершённых функциях.

ПРОДОЛЖАЕМ РАБОТУ С РЕКУРСИВНЫМИ ВЫЗОВАМИ ФУНКЦИИ

  • ВТОРОЙ ВЫЗОВ (х = 15)

→ Вновь Python начнёт обрабатывать функцию four, только теперь с новым аргументом х = 15

Стек рекурсивной функции (four).
Стек рекурсивной функции (four).

→ Условие if не будет выполнено, поэтому интерпретатор перейдёт к команде print(x). На экране консоли появится число 15 — текущее значение переменной х

-18

После вывода текущего значения х, Python перейдёт к следующей строке внутри функции →

  • four(x - 5) — что означает, очередной рекурсивный вызов функции four
-19
  • ТРЕТИЙ ВЫЗОВ (х = 10)

→ Вновь Python начнёт обрабатывать функцию four, только теперь с новым аргументом х = 10

Стек рекурсивной функции (four).
Стек рекурсивной функции (four).
  • Вывод на экран текущего значения переменной х
-21
  • Очередной рекурсивный вызов функции four
-22
  • ЧЕТВЁРТЫЙ ВЫЗОВ (х = 10)

→ Вновь обработка функции four, только теперь с новым аргументом х = 5

Стек рекурсивной функции (four).
Стек рекурсивной функции (four).
  • Вывод на экран текущего значения переменной х
-24
  • Очередной рекурсивный вызов функции four
Стек рекурсивной функции (four).
Стек рекурсивной функции (four).
  • ПЯТЫЙ ВЫЗОВ (х = 0)

→ Вновь обработка функции four, только теперь с новым аргументом х = 0

Стек рекурсивной функции (four).
Стек рекурсивной функции (four).

💢УСЛОВИЕ ВНУТРИ if ВЫПОЛНЯЕТСЯ ↷

Поскольку текущее значение переменной x равно 0 →

  • if x == 0 — True (Истина)

Условие выполняется, поэтому Python перейдёт к коду, внутри if

  • return print('W')

Данная строка завершает выполнение текущего вызова функции four и выводит символ W в консоль ⤵

Вывод в консоль символа (W).
Вывод в консоль символа (W).

⭐ Отлично! Python выполнил команду return внутри функции four.

  • Что дальше? Что будет после команды return?

— Команда return завершает выполнение текущей функции four(0)

  • Что будет с предыдущими вызванными функциями: four(5), four(10) .. ?

— Все эти функции тоже будут завершены

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

❕ВАЖНЫЙ МОМЕНТ

— return не останавливает все функции сразу

Схема вызовов рекурсивной функции (four) после выполнения команды (return).
Схема вызовов рекурсивной функции (four) после выполнения команды (return).

→ Шаги выполнения функции four(0):

  1. Вызов four(0) ⤵
    печатает W
    returnвыходит из four(0)
  2. Возврат в four(5) ⤵
    После строки four(x - 5) больше кода нет ✖
    → функция завершается автоматически
  3. Те же действия и для функций:
    four(10)
    four(15)
    four(20)

→ Когда последний вызов функции four(0) будет завершён, Python перейдёт к предыдущему вызову функции four(5)

Схема вызовов рекурсивной функции (four) после выполнения команды (return).
Схема вызовов рекурсивной функции (four) после выполнения команды (return).

→ После завершения функции four(5), Python перейдёт к предыдущему вызову four(10)

Схема вызовов рекурсивной функции (four) после выполнения команды (return).
Схема вызовов рекурсивной функции (four) после выполнения команды (return).

→ После завершения функции four(10), Python перейдёт к предыдущему вызову four(15)

Схема вызовов рекурсивной функции (four) после выполнения команды (return).
Схема вызовов рекурсивной функции (four) после выполнения команды (return).

→ После возврата к самому первому вызову four(20) выполнение программы завершится 🔚

❓Почему в рекурсивной функции four() нет 'RecursionError'

— Есть условие выхода (if x == 0)

Условие при котором функция перестаёт вызывать саму себя

— Переменная x уменьшается: four(x - 20), four(x - 15) и так далее

Что и позволяет достичь условия выхода

➡️РЕКУРСИЯ КОРРЕКТНАЯ И БЕЗОПАСНАЯ ✅

⚡Прекрасная работа! Теперь, разобравшись с рекурсивной функцией в Python, можно приступить к решению заданий формата ЕГЭ и не только ↷

🔥ПРОДОЛЖЕНИЕ СТАТЬИ 📥

-32