Тема: Алгоритм и его свойства. Формальная обработка информации — это, четкое и бездумное следование инструкции, предписывающей исполнителю выполнение определенной последовательности действий. Конечно, такие инструкции могут быть устроены по-разному. К примеру, для машины Тьюринга инструкция, определяющая обработку информации, представлена функциональной схемой. Но каждый, кто попытался “влезть в шкуру” машины Тьюринга ощутил, насколько далека от человеческой логика такой инструкции. Для нас намного естественнее инструкции, в которых в явном виде предъявлена последовательность осуществления заданных действий. Такого типа инструкцию называют алгоритмом. Алгоритм — это последовательность допустимых для некоторого исполнителя действий, направленная на достижение определенной цели”. Свойства алгоритма Дискретность. Под дискретностью понимается то, что алгоритм состоит из описания последовательности тактов обработки, организованной таким образом, что в начальный момент задается исходная ситуация, а в каждый следующий момент ситуация преобразуется на основе данных, полученных в предшествующие такты обработки. Дискретность алгоритма означает, что он исполняется по шагам: каждое действие, предусмотренное алгоритмом, исполняется только после того, как закончилось исполнение предыдущего. Детерминированность. Это свойство означает, что на каждом шаге исполнения алгоритма (см. свойство дискретности) однозначно определено преобразование объектов среды исполнителя, полученных на предшествующих шагах алгоритма. По-другому это свойство алгоритма называют точностью. Результативность. Это свойство подразумевает, что каждое действие в алгоритме после своего завершения создает ситуацию, в которой все имеющиеся объекты однозначно определены. Если это по каким-либо причинам невозможно, то алгоритм должен сообщить, что решение задачи не существует. Это свойство является обязательным для любого алгоритма. Обычно говорят о результативности алгоритма в целом, подразумевая, что алгоритм предназначен для решения той или иной задачи. Как правило, одновременно с результативностью в целом подразумевается и конечность алгоритма, т.е. завершение его работы за конечное число шагов (при этом количество шагов может быть заранее неизвестным и различным для разных начальных ситуаций). Массовость. С точки зрения практической ценности алгоритма важно, чтобы множество допустимых начальных ситуаций было для него достаточно большим (иногда говорят, потенциально бесконечным). Например, известный из начальной школы алгоритм сложения столбиком двух натуральных чисел является массовым, поскольку применим к любой паре натуральных чисел. Конечность алгоритма — это тоже свойство, присущее далеко не всем алгоритмам, используемым на практике. Почти все алгоритмы, применяемые для управления объектами в режиме реального времени, не являются конечными: трудно представить себе конечный алгоритм (т.е. прекращающий работу через конечное число шагов) компьютерного управления полетом космической станции или работой ядерного реактора. Конечно, такие алгоритмы, как правило, включают в себя режим ожидания вмешательства человека (нажатия той или иной клавиши, щелчка мыши и т.п.), но по своему устройству такой алгоритм не является конечным. Впрочем, бесконечно исполняемые алгоритмы играют важную роль в общей теории алгоритмов. Вот пример такого алгоритма. Исполнитель обрабатывает слова, записываемые в алфавите из двух букв — a и b. Допустимые действия исполнителя — это переход от слова X к слову Y в одном из двух случаев: а) если X имеет вид аР, где Р — любое слово над данным алфавитом, то Y = Pb; б) если X имеет вид bаР, где Р — любое слово над данным алфавитом, то Y = Paba. Сам алгоритм выглядит так: алг Слова (арг сим Х, рез сим Y) нач ввод X; Y := X; нц пока не получится слово Y, начинающееся буквосочетанием bb, применить к слову Y то действие, которое можно применить, и результат обозначить снова Y; кц вывод Y кон Задания для контроля знаний 1. Перечислите свойства, которые обычно рассматриваются для алгоритма. Какие из этих свойств обязательно должны присутствовать? 2. Исполнитель имеет следующие допустимые действия: — стереть с доски два числа и вместо них написать одно, равное их сумме, увеличенной на 1; — сосчитать количество чисел на доске; — сравнить два натуральных числа. Рассмотрите следующий алгоритм. алг Суммирование+ нач нц пока (на доске более одного числа) Стереть какие-нибудь два числа и вместо них записать их сумму, увеличенную на 1 кц кон а) Объясните, почему этот алгоритм не является детерминированным. б) Будет ли этот алгоритм однозначным? 3. Для алгоритмов, приведенных ниже в пунктах а) – б), постарайтесь описать множество тех начальных ситуаций, для которых данный алгоритм результативен. а) алг Суммирование_1 (арг цел N, рез вещ S) нач цел K ввод N S := 0 нц для K от 1 до N S := S + K кц вывод S кон б) алг Преобразование_в_вопрос (арг сим С, рез сим А, В) нач ввод С А := С + " " + "goes to school." B := "Does" + " " + С + " " + Часть (А, 1, 2) + Часть (А, 5, 10) + "?" вывод А, В кон Практическая работа «Решение задач по теме алгоритмы» Рассмотрим следующую задачу. Задача 1. Последовательность Xn строится так: X1 = 1; X2 = 3; ... ; Xn = Xn-2 — 2Xn-1 для каждого n > 2. Составьте алгоритм нахождения первого числа в этой последовательности, большего 100 000. Каждый из вас легко составит такой алгоритм. Ясно, что переменные здесь можно считать имеющими целочисленный тип. Нужный алгоритм записывается так: алг Задача_1 (рез вещ Z) нач цел X, Y X := 1 Y := 3 Z := Y нц пока (Z < 100000) Z := X - 2 * Y X := Y Y := Z кц вывод Z кон Изменим условие этой задачи. Задача 2. Последовательность Xn строится так: X1 = 1; X2 = 3; ... ; Xn = Xn-2 – 2Xn-1 для каждого n > 2. Найти первое в этой последовательности число, большее 100 000. На первый взгляд кажется, что это та же задача. Но давайте задумаемся, что является ответом в каждой их них. В первой это алгоритм, и он уже приведен выше; во второй ответом служит число. Значит, это все-таки не одна и та же задача, хотя ясно, что для решения задачи 2 надо просто запустить алгоритм, служащий ответом в задаче 1. И тут возникает вопрос: получим ли мы ответ, запустив созданный нами алгоритм? Легко понять, что помешать этому может только одно отсутствие в данной последовательности хотя бы одного числа, большего 100 000. Алгоритм же в этом случае будет исполняться бесконечно, вырабатывая все новые и новые члены последовательности. Что же мы видим? Вопрос о конечности данного алгоритма оказался равносилен вопросу о существовании объекта, который этим алгоритмом строится. Итак, надо убедиться, что в данной последовательности встретится хотя бы один раз число, большее 100 000. Чтобы найти подход к тому, как в этом можно убедиться, полезно взглянуть на десяток первых членов последовательности. Вот эти 10 членов: 1; 3; –5; 13; –31; 78; –181; 437; –1055; 2547. Глядя на них, можно высказать гипотезу, что члены с четными номерами положительны и неограниченно возрастают. Докажем эту гипотезу. Для этого выразим X2k через предшествующие члены последовательности с четными номерами. X2k = X2k-2 – 2 X2k-1 = X2k-2 – 2 (X2k-3 – 2 X2k-2) = 5 X2k-2 – 2 X2k3 = 5 X2k-2 – 2 (X2k-5 – 2 X2k-4) = 5 X2k-2 + 4 X2k-4 – 2 X2k-5 = 5 X2k-2 + 4 X2k-4 – 2 (X2k-7 – 2 X2k-6) = 5 X2k-2 + 4 X2k-4 + 4 X2k-6 – 2 X2k-7 = ... = 5 X2k-2 + 4 X2k-4 + 4 X2k-6 + ... + 4 X2 – 2 X1. Поскольку 4X2 – 2X1 = 10, индуктивное рассуждение показывает, что все члены последовательности с четными номерами положительны. Более того, теперь ясно, что X2k > 5 X2k-2. Применяя это неравенство k раз, получаем: X2k > 5k–1 X2. Поэтому в данной последовательности имеются члены, большие не только 100 000, но и вообще любого положительного числа. Можно сказать, что мы доказали следующую теорему: Теорема. Пусть последовательность Xn определена следующим рекуррентным соотношением: X1 = 1; X2 = 3; ... ; Xn = Xn-2 – 2Xn-1 для каждого n > 2. Тогда для любого положительного числа M в этой последовательности существует член, больший чем M. Заметьте: ни в формулировке теоремы, ни в ее доказательстве не указывается, каким по номеру будет искомый член последовательности. Более того, не намечается даже способ нахождения нужного члена последовательности. Теоремы, в которых доказывается существование какого-либо объекта, обладающего требуемыми свойствами, без указания способа построения этого объекта называют теоремами чистого существования. А теоремы, в которых существование нужного объекта доказывается указанием способа его построения, называются конструктивными теоремами существования. Задания для самостоятельной работы 1. В чем различие между конструктивными теоремами и теоремами чистого существования? 2. Для решения задачи “В какую наименьшую натуральную степень надо возвести число 3, чтобы получилось число, оканчивающееся на 00001?” был составлен следующий алгоритм: алг Показатель степени (рез цел N) нач цел: X, Y X := 1 Y := 2 N := 0 нц пока (Y > 1) X := 3 * X Y := mod(X, 100000) N := N + 1 кц вывод N кон а) Объясните, почему данный алгоритм решает поставленную задачу. б) Докажите, что данный алгоритм конечен. 3. Дан алгоритм: алг Задача_2 (арг вещ А, Е, рез вещ Х) нач ввод А ввод Е X := 1 нц пока ABS(X * X - A) E X := (X + A/X)/2 кц вывод Х кон а) Доказать, что при любых положительных A и E алгоритм завершит свою работу за конечное число шагов. б) Попытайтесь оценить количество шагов в зависимости от А и Е, которое будет совершено при исполнении этого алгоритма.