2. В программе My7_2 реализован процесс, относительно которого выдвинута так называемая гипотеза Сиракуз. Это
процесс последовательного преобразования натурального
числа n в 1. Запустив программу, проверяем ее работу при не-
скольких значениях n и видим, что предусмотренный резуль-
тат каждый раз достигается. Отсюда мы делаем предположе-
ние, что работа программы завершится, то есть результат
будет получен при любом значении n. Однако с достовернос-
тью это неизвестно, доказательство факта завершения работы
программы (алгоритма) при любом значении n до сих пор ни-
кем не получено7
. Другими словами, есть алгоритм (програм-
ма), но его конечность, завершаемость работы во времени —
открытый вопрос, требующий своего обоснования. Мораль:
проверка циклов типа While требует особо тщательной рабо-
ты, ибо подобные циклы «потенциально бесконечны во време-
ни».
Program My7_2;
Var n:Integer;
Begin
WriteLn('Введите натуральное число:');
ReadLn(n);
Write(n);
While n<>1 Do Begin
If n Mod 2=0 Then n:=n Div 2
Else n:=(3*n+1) Div 2;
Write(' - ',n);
End;
ReadLn;
End.
Последовательно запуская программу, оцените среднюю
длину получаемых цепочек чисел при изменении n от 2 до 20.
Как избавиться от этой ручной работы по многократному
запуску программы?
Рассматривая полученные цепочки чисел, нетрудно заме-
тить, что фрагменты этих цепочек часто повторяются. Напри-
мер, 8421, 5168421. Как использовать этот
факт при подсчете средней длины цепочек для чисел (n) из
большого интервала, например типа Integer? Потребуется ли в
этом случае что-либо изменять в приведенном фрагменте про-
граммы?