Статья Автор: Лебедев Дмитрий

TUZ_2-24 n - й член последовательности Ван Эка

TUZ_2-24 n - й член последовательности Ван Эка

TUZ_2-24 n - й член последовательности Ван Эка
2.24 n - й член последовательности Ван Эка
Рассмотрим последовательность S, состоящую из положительных целых чисел.
Первый член S равен 0. Есть ли ноль перед текущим нулем? Нет, поэтому последовательность равна (0, 0).
Для последнего числа (в данном случае для второго нуля) задается тот же вопрос: есть ли ноль перед текущим (вторым) нулем?
Да, поэтому последовательность равна (0, 0, 1).
И снова для последнего числа (1) задается вопрос: есть ли «единица» перед текущей единицей? Нет, значит, последовательность равна (0, 0, 1, 0).
И снова для последнего числа (0) задается вопрос: есть ли ноль перед текущим нулем? Да, поэтому последовательность равна (0, 0, 1, 0, 2) и т. д.
Проще говоря, последовательность подсчитывает количество шагов, необходимых для достижения первого запрошенного числа,
если следовать начиная с хвоста последовательности до запрошенного числа, и подсчет прекращается, когда обнаруживается искомое число.
Эта популярная последовательность называется последовательностью Ван Эка. Ее члены определяются рекурсивно, поскольку каждый следующий член вычисляется на основе предыдущих.
Ваша задача: написать функцию, которая принимает положительное целое число n и возвращает n-й член последовательности Ван Эка.
В табл. 2.24 показаны ожидаемые результаты для некоторых входных данных.
Таблица 2.24. Некоторые ожидаемые результаты для задачи поиска n?го члена последовательности Ван Эка
n Ожидаемый результат
258 3
25 4
2 1
2089 0

Алгоритм
.Ниже перечислены шаги, выполняемые алгоритмом поиска n-го члена последовательности Ван Эка.
1. Последовательность инициализируется первым членом, равным 0.
2. Создается пустой словарь для хранения каждого значения в после- довательности с их индексами.
3. Для каждого индекса от 0 до n – 1:
1) получить предыдущее значение в последовательности seq [i];
2) проверить, встречалось ли предыдущее значение раньше, поиском его в словаре;
3) если встречалось, то вычислить разность между текущим и предыдущим значениями;
4) добавить разность в последовательность;
5) если предыдущее значение не встречалось, добавить в последо- вательность 0;
6) обновить словарь, указав текущий индекс i для предыдущего значения.
4. Вернуть n-й член последовательности, то есть seq [n – 1].


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать