Шаг 95.
Рекурсия на Python.
Линейная рекурсия II: хвостовая рекурсия. Примеры задач

    На этом шаге мы рассмотрим несколько заданий и приведем их решения.

    Приведем несколько примеров решения задач.

    Задание 1. Пусть а - сортированный (в порядке возрастания) список различных целых чисел. Цель этой задачи - эффективный поиск элемента, значение которого совпадает с его позицией (индексом) в списке. Иными словами, нужно найти элемент i, для которого аi = i. Например, если а = [-3, -1, 2, 5, 6, 7, 9], то результатом будет 2, так как а2 = 2. Отметим, что первый элемент списка расположен в позиции 0. Для простоты считайте, что в а не более одного элемента, удовлетворяющего условию аi = i. Если в списке нет такого элемента, функция должна вернуть значение -1.

Раскрыть/скрыть решение и комментарии.

    Задание 2. Определите и реализуйте хвостовую рекурсивную логическую функцию, определяющую, содержит ли неотрицательное целое число n нечётную цифру.

Раскрыть/скрыть решение и комментарии.

    Задание 3. Алгоритм "сортировки подсчётом" - это метод сортировки списка из n целых чисел в диапазоне [0, k], где k достаточно малое. Метод работает за время Ο(n + k), откуда следует, что он работает за время Ο(n) при k ∈ Ο(n).

    Для заданного списка a метод создаёт новый список b, который содержит количество вхождений каждого целого числа в а, как показано на рисунке 1 (шаг 1).


Рис.1. Шаги алгоритма сортировки подсчётом

    Например, b2 = 4, так как целое число 2 появляется в а четыре раза. Реализуйте хвостовую рекурсивную процедуру, которая получает списки а и b (изначально нулевой) и заполняет список b количествами вхождений целых чисел в a.

    Кроме того, реализуйте линейно-рекурсивную функцию, которая получает список b с количествами вхождений и возвращает новый список c - отсортированную версию а, как показано на рисунке 1 (шаг 2).

Раскрыть/скрыть решение и комментарии.

    Со следующего шага мы начнем рассматривать множественную рекурсию.




Предыдущий шаг Содержание Следующий шаг