Исследуй, как функция вызывает саму себя, и научись находить базовый случай, который останавливает цепочку вызовов.
№1 · ПРИНЦИП
1 ВОПРОС · 1 БАЛЛ
1. Результат работы рекурсивной функции
Рассмотри программу и выбери значение, которое она выведет. Функция на каждом шаге сначала уменьшает параметр на 1, затем возвращает результат сложения текущего параметра и результата следующего вызова.
2
6
0
3
№2 · БАЗОВЫЙ СЛУЧАЙ
1 ВОПРОС · 1 БАЛЛ
2. Условие остановки
Выбери базовый случай для функции countdown(n), которая выводит числа от n до 0 и на каждом шаге уменьшает n на 1.
Если n == 0, больше не вызывать функцию
Если n == 1, увеличить n на 1
Если n > 0, снова вызвать функцию с n + 1
Если n < 0, продолжить вызовы с n - 1
№3 · ПОРЯДОК ВЫЗОВОВ
1 ЦЕПОЧКА · 1 БАЛЛ
3. Трассировка countdown
Расположи элементы в порядке выполнения при вызове countdown(3): сначала происходят вызовы и выводы, затем начинается возврат из рекурсивных вызовов.
Вызов countdown(2)
Вызов countdown(1)
Вызов countdown(3)
Возврат из вызова countdown(0)
Вызов countdown(0)
№4 · СТРУКТУРА ФУНКЦИИ
4 ЭЛЕМЕНТА · 2 БАЛЛА
4. Состав рекурсивного алгоритма
Заполни пропуски в описании корректной рекурсивной функции.
Корректная рекурсивная функция содержит — условие остановки, и — вызов функции с изменённым аргументом. Каждый новый вызов должен к базовому случаю. Если такого приближения нет, возможна рекурсия.
№5 · СУММА
1 ЗАДАЧА · 2 БАЛЛА
5. Рекурсивная сумма от 1 до n
Рассмотри функцию: ```python def total(n): if n == 1: return 1 return n + total(n - 1) ``` Какое значение вернёт вызов `total(4)`?
№6 · ФАКТОРИАЛ
1 ЗАДАЧА · 2 БАЛЛА
6. Разбор факториала
Рассмотри функцию: ```python def fact(n): if n == 1: return 1 return n * fact(n - 1) ``` Заполни таблицу значений промежуточных вызовов для `fact(4)`.
Вызов
Значение, возвращаемое функцией
fact(1)
1
fact(2)
fact(3)
fact(4)
+5 заданий в этом листе
Зарегистрируйтесь — и соберите свой рабочий лист по этой теме за минуту: заданий столько, сколько нужно.
№7 · ОШИБКИ
4 УТВЕРЖДЕНИЯ · 2 БАЛЛА
7. Когда рекурсия становится бесконечной
Определи истинность каждого утверждения только с точки зрения устройства рекурсивных функций и условия остановки.
В корректной рекурсивной функции должен быть базовый случай.ИстинаЛожь
Если аргумент в каждом вызове приближается к базовому случаю, это помогает остановить рекурсию.ИстинаЛожь
Рекурсивная функция обязательно содержит цикл while.ИстинаЛожь
Если функция вызывает себя с тем же аргументом и не имеет остановки, возможна бесконечная рекурсия.ИстинаЛожь
№8 · СОПОСТАВЛЕНИЕ
4 СВЯЗКИ · 3 БАЛЛА
8. Часть кода и её роль
Соедини фрагмент рекурсивной функции с его ролью в алгоритме. Каждый фрагмент используется один раз.
if n == 0: return 0
returnn+sumton(n−1)
sumton(5)
n - 1
изменение аргумента в сторону остановки
первичный вызов функции
рекурсивный шаг
базовый случай
№9 · АНАЛИЗ КОДА
1 ЗАДАЧА · 4 БАЛЛА
9. Сумма цифр рекурсивно
Дана функция: ```python def digits_sum(n): if n < 10: return n return n % 10 + digits_sum(n // 10) ``` Выполни трассировку вызова `digits_sum(472)` и укажи результат. Объясни, как операция `n // 10` приближает аргумент к базовому случаю.
№10 · ЕВКЛИД
1 ЗАДАЧА · 5 БАЛЛОВ
10. Рекурсивный алгоритм Евклида
Рассмотри функцию: ```python def gcd(a, b): if b == 0: return a return gcd(b, a % b) ``` Проанализируй вызов `gcd(48, 18)`: запиши цепочку рекурсивных вызовов до базового случая, назови базовый случай и укажи результат.