Рекурсия

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

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

Вы научитесь:
1. Определять базовые и рекурсивные случаи.
2. Читать и трассировать рекурсивный код.
3. Находить ошибки, приводящие к ошибке переполнения стека (RecursionError).
4. Реализовывать классические алгоритмы (факториал, числа Фибоначчи).

Будьте внимательны: в Python существует ограничение на глубину рекурсии, поэтому правильный выход из функции критически важен!

Список тем

Основные понятия рекурсии

id: 40043_task1

Чтобы правильно писать рекурсивные функции, нужно четко понимать их составные части. Сопоставьте термины с их определениями.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Условие, при котором функция прекращает вызывать саму себя и возвращает значение.
Часть функции, где она вызывает саму себя с измененными аргументами.
Ошибка, возникающая, когда функция вызывает себя бесконечно (или слишком много раз).
Максимальное количество вложенных вызовов, допустимое интерпретатором.
Базовый случай (Base case)
Рекурсивный шаг (Recursive step)
RecursionError (Stack Overflow)
Глубина рекурсии (Recursion depth)
Сообщения
Проверить
Показать подсказку

Обратный отсчет

id: 40043_task2

Проанализируйте код функции обратного отсчета. Какой будет результат выполнения при вызове с аргументом 3? Обратите внимание на порядок оператора print и рекурсивного вызова.

Выберите правильный вариант ответа
def countdown(n):
    if n <= 0:
        print("Start!")
    else:
        print(n)
        countdown(n - 1)

countdown(3)
Сообщения
Проверить
Показать подсказку

Сумма чисел от 1 до N

id: 40043_task3

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

Заполните пропуски
def recursive_sum(n):
    if n == 1:
        return input1S
    return n + input2S
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Бесконечная рекурсия

id: 40043_task4

В этой функции допущена критическая логическая ошибка, приводящая к `RecursionError`. Найдите строку, которая делает рекурсию бесконечной, и исправьте её. Цель функции — печатать числа от n до 0.

Найдите ошибку и исправьте
def print_numbers(n):
    if n == 0:
        return
    print(n)
    print_numbers(n)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Рекурсивное возведение в степень

id: 40043_task5

Соберите функцию `power(x, n)`, которая вычисляет $x^n$. Расставьте строки кода в правильном порядке: сначала проверка базового случая, затем рекурсивный шаг.

Расставьте строки в правильном порядке
def power(x, n):
    return x * power(x, n - 1)
    if n == 0:
        return 1
Сообщения
Проверить
Показать подсказку

Факториал числа

id: 40043_task6

Соберите функцию вычисления факториала ($n! = n \cdot (n-1)!$). Помните, что факториал 0 или 1 равен 1. Будьте внимательны, одна строка содержит ошибку и является лишней.

Перетяните в правильном порядке строки из одного блока в другой
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)
    return n * factorial(n)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Числа Фибоначчи

id: 40043_task7

Заполните пропуски в функции для вычисления n-го числа Фибоначчи. В этой последовательности каждое следующее число — это сумма двух предыдущих. Базовые случаи: для n=1 и n=2 результат равен 1.

Нужно правильно расставить в пропуски предложенные варианты
def fib(n):
    if input1S <= 2:
        return input2S
    return fib(input3S) + fib(n - 2)
n
1
n - 1
0
n + 1
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Итерация против Рекурсии

id: 40043_task8

Распределите утверждения между двумя подходами к решению задач: итеративным (циклы) и рекурсивным (вызов функции).

Перетяните элементы в соответствующие блоки
Итеративный подход
Рекурсивный подход
Использует циклы for или while
Требует базовый случай (условие выхода)
Может вызвать переполнение стека (Stack Overflow)
Обычно использует меньше памяти (нет накладных расходов на вызовы)
Функция вызывает сама себя
Сообщения
Проверить
Показать подсказку

Что вернет функция?

id: 40043_task9

Дана необычная рекурсивная функция. Вычислите в уме или на бумаге, что она вернет при вызове `mystery(10, 2)`. Введите только число.

Что должно получиться?
def mystery(a, b):
    if a < b:
        return 0
    else:
        return 1 + mystery(a - b, b)

# mystery(10, 2)
Сообщения
Проверить
Показать подсказку

Ошибка выхода из рекурсии

id: 40043_task10

Что произойдет при запуске этого кода? Внимательно посмотрите на условие в `if` и аргумент вызова.

Выберите правильный вариант ответа
def walk(n):
    if n == 0:
        return "Done"
    else:
        print(n)
        return walk(n + 1)

walk(5)
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру