Функция, которая зовёт сама себя. 10 класс, углублённый уровень — занятие двенадцатое.
Урок 23 плана — «Рекурсия. Рекурсивные объекты (фракталы). Рекурсивные процедуры и функции. Использование стека для организации рекурсивных вызовов», урок 24 — практическая работа «Рекурсивные подпрограммы». В прошлой паре функция звала другую функцию. Сегодня — саму себя.
Сумма цифр 3815 — это сумма цифр 381 плюс 5.
А сумма цифр 381 — это сумма цифр 38 плюс 1. И так, пока не останется одна цифра: у неё ответ известен сразу.
Базы нет: f(5) зовёт f(4), та — f(3), … f(−1), f(−2)… без конца.
Каждый незаконченный вызов занимает место. Около тысячи
вызовов — и Python останавливает программу: .
| Спуск | Что ждёт в стеке | Подъём |
|---|---|---|
| ответа | 12 + 5 = 17 | |
| ответа | 11 + 1 = 12 | |
| ответа | 3 + 8 = 11 | |
| база — ответ сразу | 3 |
У каждого вызова своё и своё «что
осталось сделать». Вызов кладётся на стек при входе и снимается при
, отдавая ответ тому, кто под ним.
: печать до вызова, на спуске —
3 2 1.
: печать после вызова, на подъёме —
1 2 3.
Ветка — это ствол и две ветки поменьше. Каждая повторяет целое.
F(1) = 1;
F(n) = F(n − 1) + n, если n > 1 и n чётно;
F(n) = 2·F(n − 1), если n > 1 и n нечётно.
Чему равно F(6)?
Формула переписывается в функцию дословно: каждый случай — ветка
, база — первый случай.
Алгоритм Евклида рекурсией — его определение почти дословно: НОД пары равен НОДу пары (b, a % b), а при b = 0 — это a.
Рекурсия хороша, когда задача сама устроена через меньшую такую же: фрактал, формула, разбор числа по цифрам.
Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно. Для этой пары — новая папка.
Сначала тренажёр, потом три программы — по порядку.
Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение рекурсивных программ, Python дома не нужен. Тройку можно добрать, четвёрку и пятёрку — только заработать. В начале следующей пары — проверочная по этим же типам.