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

TUZ_2-18 Расстояние Коллатца

TUZ_2-18 Расстояние Коллатца
Задача 50249

TUZ_2-18 Расстояние Коллатца
2.18 Расстояние Коллатца
Имея заданное целое число n, требуется достичь некоторого положительного целого числа с применением формул 3 × n + 1 и n//2, взятых из гипотезы Коллатца. Пусть путь между начальным и конечным числами start и goal имеет несколько слоев, содержащих по нескольку положительных целых чисел.
Первый слой инициализируется начальным числом start. Все положительные целые числа имеют одинаковое расстояние в каждом слое.
Начиная с начального числа start для каждого следующего слоя генерируются числа однократным применением формул 3 × n + 1 и n//2 к каждому числу в предыдущем слое. Создание слоев продолжается, пока в каком-то из них не будет получено искомое число goal.
Рассмотрим следующий пример. Пусть start = 10 и goal = 20. На каждом шаге генерируется несколько положительных целых чисел с одинаковым расстоянием, пока не будет получено число goal. Поскольку первый (будем считать его нулевым) слой инициализируется числом start, в нем имеется только число 10. Далее: 
• слой 1: к числу 10 применяются формулы 3 × n + 1 и n//2, и получают- ся два числа (3n + 1) = (3 × 10 + 1) = 31, (n//2) = (10//2) = 5;
• слой 2: к числам 31 и 5 применяются те же формулы, и получаются четыре числа (3 × 31 + 1) = 94, (3 × 5 + 1) = 16, (31//2) = 15, (5//2) = 2;
• слой 3: 283, 49, 46, 7, 47, 8, 7, 1;
• слой 4: 850, 148, 139, 22, 142, 25, 22, 4, 141, 24, 23, 3, 23, 4, 3, 0;
• слой 5: 2551, 445, 418, 67, 427, 76, 67, 13, 424, 73, 70, 10, 70, …;
• слой 6: 7654, 1336, 1255, 202, 1282, 229, 202, 40, …;
• слой 7: 22963, 4009, 3766, …, 20… 
Как видите, в слое 7 обнаружилось целевое число 20.
Ваша задача: написать функцию, которая принимает начальное и конечное числа и возвращает номер слоя, в котором присутствует целевое число.
В табл. 2.18 показаны ожидаемые результаты для некоторых входных данных.
Таблица 2.18. Некоторые ожидаемые результаты для задачи поиска целевого числа на основе расстояния Коллатца
Start, goal Ожидаемый результат
20, 321 9
22, 15 8
4, 7 2
10, 20 7

Алгоритм
.Для достижения целевого числа используется метод поиска в ширину (Breadth-First Search, BFS).
Алгоритм BFS сначала обходит все узлы на одном уровне и только потом переходит на следующий. В нашем случае каждый сгенерированный слой, возникающий в результате применения формул из гипотезы Коллатца, образует уровень, который нужно исследовать.
Алгоритм начинает исследование с числа start_num, представляющего первый слой, и генерирует последующие слои, применяя одни и те же формулы. Вот подробное описание шагов алгоритма.
1. Принимаются два положительных целых числа start_num и goal_num.
2. Инициализируются переменные num_layers и curr_layer, где num_ layers = 0 и curr_layer – множество,
    содержащее только начальное число, т. е. start_num.
3. Пока goal_num не обнаружится в curr_layer, выполняются следующие действия:
• создается пустое множество next_layer (поскольку повторяющиеся числа нам не нужны);
• для каждого числа в curr_layer вычисляются значения по формулам num//2 и 3 ∗ num + 1;
• эти значения добавляются в next_layer; • значение next_layer присваивается переменной curr_layer;
• num_layers увеличивается на 1.
4. Если goal_num присутствует в curr_layer, то возвращается num_layers.


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