§4.1. Понятие алгоритма. Свойства алгоритмов

Представления о программах среднестатистического пользователя весьма ограничены и основаны на опыте запуска и работы в приложениях. Мы знаем, что существуют программисты, пишущие программы, а наше дело — воспользоваться результатами их труда. Об алгоритмах люди, закончившие школу энное время назад, вспоминают в контексте теории алгебры, смутно представляя, что эти знания уж точно не пригодятся. А если приходится столкнуться с пересечением этих понятий — большинство из нас теряется, не находя связей между алгоритмами и программами, и, значит, не понимая поставленной задачи. Иногда эти понятия объединяют, считая, что “алгоритм” — более профессиональное и точное обозначение “программы”. Чтобы заполнить пробелы в представлениях, посмотрим, что все же стоит за терминологией.

Определение

Алгоритм — инструкция, включающая определенный четкий порядок действий, совершаемых для выполнения поставленной задачи. Число действий всегда конечно.

Программа (компьютерная, прежде всего) — запись последовательности инструкций, исполняемых компьютером.

Сравнение

В чем разница между алгоритмом и программой ясно уже из терминологии. Казалось бы, в обоих случаях мы видим упорядоченные действия, приводящие к конечному результату. Как понятно из определений, программа может состоять из нескольких алгоритмов, однако иерархия “общее — частное” здесь не прослеживается. Алгоритм — это вообще любая инструкция, в которой четко перечислены действия. Например, для сборки шкафа. Программой она, конечно, являться не будет. Алгоритм может существовать в любой форме: его можно запомнить, записать в блокнот, зарисовать в виде схемы, продиктовать, так как в основе его — логическая составляющая, а не формальная. Программа же — понятие формальное. Она представляет собой именно запись набора алгоритмов, причем запись на одном из языков программирования, понятных вычислительной машине. Это может быть не только наш привычный компьютер, но и блок управления любого прибора. Таким образом, алгоритм можно определить как метод или схему воплощения идеи, программу — как ее реализацию конкретными средствами.

Еще одно отличие программы от алгоритма — оперирование конкретными данными в процессе выполнения. Если алгоритм представляет собой только описание действий, требующихся для достижения цели, то программа содержит и описание данных в том числе. Алгоритм может быть массовым, то есть предназначаться для решения не одной задачи, а класса задач. Вместе с тем к его свойствам относят еще дискретность и определенность. Алгоритм подразумевает совершение элементарных действий над элементарными объектами, однако для разных исполнителей элементарность будет разной.

Понятие алгоритма гораздо шире, нежели программы: базовое понятие математики. Компьютерная программа является объектом права интеллектуальной собственности, алгоритм же к таковым не относится.

Выводы сайт

  1. Алгоритм — инструкция, программа — запись последовательности инструкций.
  2. Алгоритм может быть представлен в любом виде, программа — на языке программирования.
  3. Программа включает описание данных и действий, алгоритм — только действий.
  4. Алгоритм может быть предназначен для решения класса задач.
  5. Алгоритм является базовым понятием математики.
  6. Программа является объектом авторского права.

Нет единой устоявшейся техники наименования сущностей в языках программирования и каждый язык, чтобы немного отличаться от других, по историческим причинам имеет свой набор названий и соглашений.

Так как программирование пришло с математики, то начальные корни нужно искать там. А там были функции и процедуры. Функция на основании своих аргументов генерирует какой-то результат. sin , cos - яркие примеры. Функция без аргументов - вырожденный вариант и обычно это константа. В математике обычно функции являются чистыми - то есть, у них нет побочных эффектов. То есть, вызов функции с одними и теми же аргументами дает один и тот же результат.

Параллельно существуют процедуры. Процедура - это последовательность действий, приводящая к определенному результату (да, обычная программа - это также может быть процедура, хотя...). В паскале и фортране принято, что процедура не возвращает результат. Но я считаю, что это исключительно соглашение, потому что иначе нужно было бы делать как в C /C++ и вводить пустой тип (void).

почему в Си++ члены не называют "методами"?

Во многих языках 60-70 годов не было ООП в том понимании, которое известно сейчас. С++ изначально был просто "фронтом" (то есть надстройкой) над обычным Си. Был долгий период, когда это уже был не Си, но и ещё и не C++ . Компилятора C++ не было, а был транслятор в Си. Видимо, поэтому там закрепилось функция класса/переменная класса. Сейчас Страуструп предлагает N4174 , и если его примут, то грань между обычными функциями и функциями класса размоется ещё больше.

В других языках - Java и семейство, проектировались, когда уже ООП был немного сформированным. От обычных функций они решили отказаться и, видимо, чтобы не вызывать путаницу, обозвали все методами. Да, потом им пришлось функции все-таки вернуть назад, но, чтобы ничего не сломать, назвали это статическими методами.

Собственно, какова разница между терминами "метод" и "функция"

Правильный ответ - историческая. Как правильно называть сущности в разных языках, нужно уточнять в их документации.

Тут все сложно. Например, Эккель так делает видимо потому, что он ещё и много книг о Java написал. Также не стоит забывать, что многие книги мы читаем в переводе, а они "исправляют", потому что переводчику так понятнее.

так можно ли называть функции класса с++ методами?

Это точно так же, как использовать мат/обсценную лексику в высшем обществе. Или пытаться объясниться с гопниками языком Тургенева и стихами Пушкина/Блока.

P.S. метод - слово многозначное и вполне можно услышать от C++ программистов такое "это метод для получения данных с сервера, реализован в виде 5 функций и двух классов".

Каждому из нас в повседневной жизни постоянно приходится решать задачи различной сложности, например, как добраться до школы или спортивной секции в условиях ограниченного времени, как успеть выполнить намеченные на день дела. Некоторые задачи настолько сложны, что их решение требует длительных размышлений. Другие, наоборот, мы решаем уже автоматически, так как сталкиваемся с ними каждый день на протяжении многих лет (почистить зубы, заправить постель, перейти улицу и т.д.). В большинстве случаев решение задачи можно разделить на несколько простых этапов.
Пример 1. Приведем решение задачи «Переход дороги по пешеходному переходу»:
1) встать на тротуаре лицом к пешеходному переходу;
2) посмотреть налево;
3) если слева от вас нет движущихся в вашем направлении автомобилей или мотоциклов, перейти дорогу до середины, иначе подождать пока они проедут и вернуться к пункту 2;
4) остановиться на середине дороги;
5) посмотреть направо;
6) если справа от вас нет движущихся в вашем направлении автомобилей или мотоциклов, перейти оставшуюся часть дороги, иначе подождать пока они проедут и вернуться к пункту 5.

Аль-Хорезми (780-850 н.э. – арабский математик IX века; от европеизированного произношения имени аль-Хорезми возник термин «алгоритм»).

Последовательность шагов, приведенная в примере 1, является алгоритмом решения задачи "Переход дороги по пешеходному переходу". Исполнитель этого алгоритма – человек. Объекты этого алгоритма – дорога, автомобили, мотоциклы.

Для решения любой задачи надо знать, что дано и что следует получить, то есть у задачи есть исходные данные (объекты) и искомый результат. Для получения результатов необходимо знать способ решения задачи, то есть располагать алгоритмом.

Приведенное определение не является определением в математическом смысле слова, это – описание понятия алгоритма, раскрывающее его сущность. Оно не является формальным, потому что в нем используются такие неуточняемые понятия, как «система предписаний», «действия исполнителя», «объект».

Понятие алгоритма, являющееся фундаментальным понятием математики и информатики, возникло задолго до появления вычислительных машин.

Первоначально под словом «алгоритм» понимали способ выполнения арифметических действий над десятичными числами. В дальнейшем это понятие стали использовать для обозначения любой последовательности действий, приводящей к решению поставленной задачи.

Приведем пример известного алгоритма – Алгоритма Евклида нахождения наибольшего общего делителя (НОД) делением двух положительных целых чисел.

Пример 2 . Даны два положительных целых числа x и y . Пусть x y, если это не так, то поменяем значения x и y местами.
1) Разделим y на x с остатком.
2) Если остаток от деления r равен 0, то число x является НОД. Стоп.
3) Если остаток от деления не равен нулю, то положим y = x , x = r и перейдем на шаг 1.

Любой алгоритм существует не сам по себе, он всегда предназначен для определенного исполнителя . Алгоритм описывается в командах исполнителя , который этот алгоритм будет выполнять. Объекты, над которыми исполнитель может совершать действия, образуют так называемую среду исполнителя . Исходные данные и результаты любого алгоритма всегда принадлежат среде того исполнителя, для которого предназначен алгоритм.

4.1.2. Свойства алгоритма

Значение слова «алгоритм» очень похоже по значению на слова «рецепт», «метод», «способ». Но, однако, любой алгоритм, в отличие от рецепта или способа, обязательно обладает следующими свойствами.

1. Дискретность. Выполнение алгоритма разбивается на последовательность законченных действий-шагов, и только выполнив одно действие, можно приступать к выполнению следующего. Произвести каждое отдельное действие исполнителю предписывает специальное указание в записи алгоритма, называемое командой .

Пример 3. Необходимо выполнить арифметические вычисления S = (x + 5) – y · 2.
Очевидно, что это выражение удобно разбить на 3 действия:
1) Сложить аргументы в скобках x и 5
2) Умножить y на 2
3) Вычесть из результата, полученного на первом шаге, результат, полученный на втором шаге.

Стоит заметить, что если исполнитель начнет выполнять 3-е действие раньше, чем дождется результата выполнения второго действия, то результат нельзя будет получить.

2. Детерминированность. Каждая команда алгоритма определяет однозначное действие исполнителя, и однозначно определяет, какая команда должна выполняться следующей. То есть если алгоритм многократно применяется к одному и тому же набору входных данных, то каждый раз получаются одни и те же промежуточные результаты и тот же выходной результат.

3. Понятность. Алгоритм не должен содержать предписаний, смысл которых может восприниматься исполнителем неоднозначно, то есть запись алгоритма должна быть настолько четкой и полной, чтобы у исполнителя не возникло потребности в принятии каких-либо самостоятельных решений. Стоит помнить, что алгоритм всегда рассчитан на выполнение «неразмышляющим» исполнителем.
Пример 4 . Рассмотрим алгоритма «Погладить белье».
1) Взять гладильную доску.
2) Установить доску на полу рядом с электрической розеткой.
3) Взять утюг.
4) Включить утюг в розетку рядом с гладильной доской.
5) Взять вещь для глажки.
6) Погладить вещь.
7) Если есть ещё вещи, перейти к шагу 5.

В этом алгоритме объектами являются гладильная доска, утюг, электрическая розетка, вещи для глажки. Все эти команды понятны для девочки 12 лет, но для девочки двух лет, они не являются понятными, а, значит, она не может быть исполнителем этого алгоритма.

4. Результативность . Под этим свойством понимается содержательная определенность результата каждого шага и алгоритма в целом. При точном исполнении команд алгоритма процесс должен прекратиться за конечное число шагов, и при этом должен быть получен ответ на вопрос задачи. В качестве одного из возможных ответов может быть и установление того факта, что задача решений не имеет. Свойство результативности содержит в себе свойство конечности – завершение работы алгоритма за конечное число шагов.

Анекдот . На работе хватились программиста – пропал. День нет, два. На звонки не отвечает. Решили проверить, что да как. Пришли к нему домой, а там, в холодной ванне сидит программист с полупустой бутылкой шампуня в руке. Отняли у него бутылку и читают инструкцию: «Нанести на влажные волосы, намылить, подождать три минуты, смыть, повторить».

Пример 5. Человек вытирает книги в шкафу. Есть набор понятных команд ему.
1) Взять самую левую книгу на верхней полке;
2) Вытереть книгу;
3) Поставить книгу на место;
4) Если справа есть книги, взять следующую книгу, иначе, если есть полки ниже, перейти к шагу 1.

Неразмышляющий исполнитель будет выполнять эти команды последовательно и никогда не остановится, так как в четвертом шаге забыли указать спуститься на полку ниже.

5. Массовость. Алгоритм пригоден для решения любой задачи из некоторого класса задач, то есть алгоритм правильно работает на некотором множестве исходных данных, которое называется областью применимости алгоритма.

4.1.3. Алгоритмы и инструкции

Возникает вопрос, возможна ли ситуация, что способ решения задачи есть, но алгоритмом он не является? Оказывается да, такие ситуации возможны. Не каждый способ решения задачи является алгоритмом.
Пример 6 . Опишем метод построения перпендикуляра к прямой MN , проходящей через заданную точку А с помощью линейки и циркуля:
1) Отложить в обе стороны от точки A на прямой MN циркулем отрезки равной длины с концами B и C .
2) Увеличить раствор циркуля до радиуса, в полтора-два раза больше длины отрезков AB и AC .
3) Провести указанным раствором циркуля дуги окружностей с центрами в точка B и C так, чтобы они охватили точку А и образовали две точки пересечения друг с другом (D и E ).
4) Взять линейку, приложить её к точкам D и E и соединить их отрезком.
При правильном построении отрезок пройдёт через точку A и будет являться перпендикуляром к прямой.

Указанный способ рассчитан на исполнителя-человека и не является алгоритмом, так как он не обладает свойством детерминированности. Детерминированность подразумевает, что на каждом шаге мы будем получать на одинаковых данных один и тот же результат, а в нашем случае исполнитель сам может сделать выбор на первом и втором шаге, от которого будет зависеть результат шага. На первом шаге исполнитель должен выбрать произвольный раствор циркуля, что позволит ему при повторном выполнении инструкций получить другой результат на этом шаге. Аналогично и на втором шаге результат зависит от выбора исполнителем раствора циркуля.

Кроме того, есть задачи, которые человек, вообще говоря, решать умеет, не зная четкого алгоритма их решения. Например, если перед человеком положить фотографии лошадей и коров и попросить определить, на каких фотографиях изображены коровы, а на каких лошади, то человек интуитивно определит, на каких фотографиях мы видим коров, а на каких – лошадей. Причем большинство его ответов будут правильными. Но написать формальный алгоритм решения этой задачи не представляется возможным.

Дадим уточненное понятие алгоритма, которое опять же не является определением в математическом смысле слова, но более формально описывает понятие алгоритма.

Слово «алгоритм» происходит от имени великого среднеазиатского ученого 8–9 вв. Аль-Хорезми (Хорезм – историческая область на территории современного Узбекистана). Из математических работ Аль-Хорезми до нас дошли только две – алгебраическая (от названия этой книги родилось слово алгебра) и арифметическая. Вторая книга долгое время считалась потерянной, но в 1857 в библиотеке Кембриджского университета был найден ее перевод на латинский язык. В ней описаны четыре правила арифметических действий, практически те же, что используются и сейчас. Первые строки этой книги были переведены так: «Сказал Алгоритми. Воздадим должную хвалу Богу, нашему вождю и защитнику». Так имя Аль-Хорезми перешло в Алгоритми, откуда и появилось слово алгоритм. Термин алгоритм употреблялся для обозначения четырех арифметических операций, именно в таком значении он и вошел в некоторые европейские языки. Например, в авторитетном словаре английского языка Webster"s New World Dictionary , изданном в 1957, слово алгоритм снабжено пометкой «устаревшее» и объясняется как выполнение арифметических действий с помощью арабских цифр.

Слово «алгоритм» вновь стало употребительным с появлением электронных вычислительных машин для обозначения совокупности действий, составляющих некоторый процесс. Здесь подразумевается не только процесс решения некоторой математической задачи, но и кулинарный рецепт и инструкция по использованию стиральной машины, и многие другие последовательные правила, не имеющие отношения к математике, – все эти правила являются алгоритмами. Слово «алгоритм» в наши дни известно каждому, оно настолько уверенно шагнуло в разговорную речь, что сейчас нередко на страницах газет, в выступлениях политиков встречаются выражения «алгоритм поведения», «алгоритм успеха» и т.д.

Проблема определения понятия «алгоритм».

На протяжении многих веков понятие алгоритма связывалось с числами и относительно простыми действиями над ними, да и сама математика была, по большей части, наукой о вычислениях, наукой прикладной. Чаще всего алгоритмы представлялись в виде математических формул. Порядок элементарных шагов алгоритма задавался расстановкой скобок, а сами шаги заключались в выполнении арифметических операций и операций отношения (проверки равенства, неравенства и т.д.). Часто вычисления были громоздкими, а вычисления вручную – трудоемкими, но суть самого вычислительного процесса оставалась очевидной. У математиков не возникала потребность в осознании и строгом определении понятия алгоритма, в его обобщении. Но с развитием математики появлялись новые объекты, которыми приходилось оперировать: векторы, графы, матрицы, множества и др. Как определить для них однозначность или как установить конечность алгоритма, какие шаги считать элементарными? В 1920-х задача точного определения понятия алгоритма стала одной из центральных проблем математики. В то время существовало две точки зрения на математические проблемы:

Все проблемы алгоритмически разрешимы, но для некоторых алгоритм еще не найден, поскольку еще не развиты соответствующие разделы математики.

Есть проблемы, для которых алгоритм вообще не может существовать.

Идея о существовании алгоритмически неразрешимых проблем оказалась верной, но для того, чтобы ее обосновать, необходимо было дать точное определение алгоритма. Попытки выработать такое определение привели к возникновению теории алгоритмов, в которую вошли труды многих известных математиков – К.Гедель , К.Черч, С.Клини, А.Тьюринг , Э.Пост, А.Марков, А.Колмогоров и многие другие.

Точное определение понятия алгоритма дало возможность доказать алгоритмическую неразрешимость многих математических проблем.

Появление первых проектов вычислительных машин стимулировало исследование возможностей практического применения алгоритмов, использование которых, ввиду их трудоемкости, было ранее недоступно. Дальнейший процесс развития вычислительной техники определил развитие теоретических и прикладных аспектов изучения алгоритмов.

Понятие «алгоритма».

В повседневной жизни каждый человек сталкивается с необходимостью решения задач самой разной сложности. Некоторые из них трудны и требуют длительных размышлений для поиска решений (а иногда его так и не удается найти), другие же, напротив, столь просты и привычны, что решаются автоматически. При этом выполнение даже самой простой задачи осуществляется в несколько последовательных этапов (шагов). В виде последовательности шагов можно описать процесс решения многих задач, известных из школьного курса математики: приведение дробей к общему знаменателю, решение системы линейных уравнений путем последовательного исключения неизвестных, построение треугольника по трем сторонам с помощью циркуля и линейки и т.д. Такая последовательность шагов в решении задачи называется алгоритмом. Каждое отдельное действие – это шаг алгоритма. Последовательность шагов алгоритма строго фиксирована, т.е. шаги должны быть упорядоченными. Правда, существуют параллельные алгоритмы, для которых это требование не соблюдается.

Понятие алгоритма близко к другим понятиям, таким, как метод (метод Гаусса решения систем линейных уравнений), способ (способ построения треугольника по трем сторонам с помощью циркуля и линейки). Можно сформулировать основные особенности именно алгоритмов.

Наличие исходных данных и некоторого результата.

Алгоритм – это точно определенная инструкция, последовательно применяя которую к исходным данным, можно получить решение задачи. Для каждого алгоритма есть некоторое множество объектов, допустимых в качестве исходных данных. Например, в алгоритме деления вещественных чисел делимое может быть любым, а делитель не может быть равен нулю.

Массовость, т.е. возможность применять многократно один и тот же алгоритм. Алгоритм служит, как правило, для решения не одной конкретной задачи, а некоторого класса задач. Так алгоритм сложения применим к любой паре натуральных чисел.

Детерминированность.

При применении алгоритма к одним и тем же исходным данным должен получаться всегда один и тот же результат, поэтому, например, процесс преобразования информации, в котором участвует бросание монеты, не является детерминированным и не может быть назван алгоритмом.

Результативность.

Выполнение алгоритма должно обязательно приводить к его завершению. В то же время можно привести примеры формально бесконечных алгоритмов, широко применяемых на практике. Например, алгоритм работы системы сбора метеорологических данных состоит в непрерывном повторении последовательности действий («измерить температуру воздуха», «определить атмосферное давление»), выполняемых с определенной частотой (через минуту, час) во все время существования данной системы.

Определенность.

На каждом шаге алгоритма у исполнителя должно быть достаточно информации, чтобы его выполнить. Кроме того, исполнителю нужно четко знать, каким образом он выполняется. Шаги инструкции должны быть достаточно простыми, элементарными, а исполнитель должен однозначно понимать смысл каждого шага последовательности действий, составляющих алгоритм (при вычислении площади прямоугольника любому исполнителю нужно уметь умножать и трактовать знак «x » именно как умножение). Поэтому вопрос о выборе формы представления алгоритма очень важен. Фактически речь идет о том, на каком языке записан алгоритм.

Формы представления алгоритмов.

Для записи алгоритмов необходим некоторый язык, при этом очень важно, какой именно язык выбран. Записывать алгоритмы на русском языке (или любом другом естественном языке) громоздко и неудобно.

Например, описание алгоритма Евклида нахождения НОД (наибольшего общего делителя) двух целых положительных чисел может быть представлено в виде трех шагов. Шаг 1: Разделить m на n . Пусть p – остаток от деления.

Шаг 2: Если p равно нулю, то n и есть исходный НОД.

Шаг 3: Если p не равно нулю, то сделаем m равным n , а n равным p . Вернуться к шагу 1.

Приведенная здесь запись алгоритма нахождения НОД очень упрощенная. Запись, данная Евклидом, представляет собой страницу текста, причем последовательность действий существенно сложней.

Одним из распространенных способов записи алгоритмов является запись на языке блок-схем. Запись представляет собой набор элементов (блоков), соединенных стрелками. Каждый элемент – это «шаг» алгоритма. Элементы блок-схемы делятся на два вида. Элементы, содержащие инструкцию выполнения какого-либо действия, обозначают прямоугольниками, а элементы, содержащие проверку условия – ромбами. Из прямоугольников всегда выходит только одна стрелка (входить может несколько), а из ромбов – две (одна из них помечается словом «да», другая – словом «нет», они показывают, соответственно, выполнено или нет проверяемое условие).

На рисунке представлена блок-схема алгоритма нахождения НОД:

Построение блок-схем из элементов всего лишь нескольких типов дает возможность преобразовать их в компьютерные программы и позволяет формализовать этот процесс.

Формализация понятия алгоритмов. Теория алгоритмов.

Приведенное определение алгоритма нельзя считать представленным в привычном математическом смысле. Математические определения фигур, чисел, уравнений, неравенств и многих других объектов очень четки. Каждый математически определенный объект можно сравнить с другим объектом, соответствующим тому же определению. Например, прямоугольник можно сравнить с другим прямоугольником по площади или по длине периметра. Возможность сравнения математически определенных объектов – важный момент математического изучения этих объектов. Данное определение алгоритма не позволяет сравнивать какие-либо две таким образом определенные инструкции. Можно, например, сравнить два алгоритма решения системы уравнений и выбрать более подходящий в данном случае, но невозможно сравнить алгоритм перехода через улицу с алгоритмом извлечения квадратного корня. С этой целью нужно формализовать понятие алгоритма, т.е. отвлечься от существа решаемой данным алгоритмом задачи, и выделить свойства различных алгоритмов, привлекая к рассмотрению только его форму записи. Задача нахождения единообразной формы записи алгоритмов, решающих различные задачи, является одной из основных задач теории алгоритмов. В теории алгоритмов предполагается, что каждый шаг алгоритма таков, что его может выполнить достаточно простое устройство (машина), Желательно, чтобы это устройство было универсальным, т.е. чтобы на нем можно было выполнять любой алгоритм. Механизм работы машины должен быть максимально простым по логической структуре, но настолько точным, чтобы эта структура могла служить предметом математического исследования. Впервые это было сделано американским математиком Эмилем Постом в 1936 (машина Поста) еще до создания современных вычислительных машин и (практически одновременно) английским математиком Аланом Тьюрингом (машина Тьюринга).

История конечных автоматов: машина Поста и машина Тьюринга.

Машина Поста – абстрактная вычислительная машина, предложенная Постом (Emil L.Post), которая отличается от машины Тьюринга большей простотой. Обе машины «эквивалентны» и были созданы для уточнения понятия «алгоритм».

В 1935 американский математик Пост опубликовал в «Журнале символической логики» статью Финитные комбинаторные процессы, формулировка 1 . В этой статье и появившейся одновременно в Трудах Лондонского математического общества статье английского математика Тьюринга О вычислимых числах с приложением к проблеме решения были даны первые уточнения понятия «алгоритм». Важность идей Поста состоит в том, что был предложен простейший способ преобразования информации, именно он построил алгоритмическую систему (алгоритмическая система Поста). Пост доказал, что его система обладает алгоритмической полнотой. В 1967 профессор В.Успенский пересказал эти статьи с новых позиций. Он ввел термин «машина Поста». Машина Поста – абстрактная машина, которая работает по алгоритмам, разработанным человеком, она решает следующую проблему: если для решения задачи можно построить машину Поста, то она алгоритмически разрешима. В 1970 машина Поста была разработана в металле в Симферопольском университете. Машина Тьюринга была построена в металле в 1973 в Малой Крымской Академии Наук.

Абстрактная машина Поста представляет собой бесконечную ленту, разделенную на одинаковые клетки, каждая из которых может быть либо пустой, либо заполненной меткой «V». У машины есть головка, которая может перемещаться вдоль ленты на одну клетку вправо или влево, наносить в клетку ленты метку, если этой метки там ранее не было, стирать метку, если она была, либо проверять наличие в клетке метки. Информация о заполненных метками клетках ленты характеризует состояние ленты, которое может меняться в процессе работы машины. В каждый момент времени головка находится над одной из клеток ленты и, как говорят, обозревает ее. Информация о местоположения головки вместе с состоянием ленты характеризует состояние машины Поста. Работа машины Поста заключается в том, что головка передвигается вдоль ленты (на одну клетку за один шаг) влево или вправо, наносит или стирает метки, а также распознает, есть ли метка в клетке в соответствии с заданной программой, состоящей из отдельных команд.

Машина Тьюринга состоит из счетной ленты (разделенной на ячейки и ограниченной слева, но не справа), читающей и пишущей головки, лентопротяжного механизма и операционного исполнительного устройства, которое может находиться в одном из дискретных состояний q 0, q 1, …, qs , принадлежащих некоторой конечной совокупности (алфавиту внутренних состояний), при этом q 0 называется начальным состоянием. Читающая и пишущая головка может читать буквы рабочего алфавита A = {a 0, a 1, …, at }, стирать их и печатать. Каждая ячейка ленты в каждый момент времени занята буквой из множества А . Чаще всего встречается буква а 0 – «пробел». Головка находится в каждый момент времени над некоторой ячейкой ленты – текущей рабочей ячейкой. Лентопротяжный механизм может перемещать ленту так, что головка оказывается над соседней ячейкой ленты, при этом возможна ситуация выхода за левый край ленты, которая является аварийной (недопустимой), или машинного останова, когда машина выполняет предписание об остановке.

Современный взгляд на алгоритмизацию.

Теория алгоритмов строит и изучает конкретные модели алгоритмов. С развитием вычислительной техники и теории программирования возрастает необходимость построения новых экономичных алгоритмов, изменяются способы их построения, способы записи алгоритмов на языке, понятном исполнителю. Особый тип исполнителя алгоритмов – компьютер, поэтому необходимо создавать специальные средства, позволяющие, с одной стороны, разработчику в удобном виде записывать алгоритмы, а с другой – дающие компьютеру возможность понимать написанное. Такими средствами являются языки программирования или алгоритмические языки.

Анна Чугайнова

Слово "Алгоритм" происходит от algorithmi - латинского написания имени аль-Хорезми, под которым в средневековой Европе знали величайшего математика из Хорезма (город в современном Узбекистане) Мухаммеда бен Мусу, жившего в 783-850 гг. В своей книге "Об индийском счете" он сформулировал правила записи натуральных чисел с помощью арабских цифр и правила действий над ними столбиком. В дальнейшем алгоритмом стали называть точное предписание, определяющее последовательность действий, обеспечивающую получение требуемого результата из исходных данных. Алгоритм может быть предназначен для выполнения его человеком или автоматическим устройством. Создание алгоритма, пусть даже самого простого, - процесс творческий. Он доступен исключительно живым существам, а долгое время считалось, что только человеку. Другое дело - реализация уже имеющегося алгоритма. Ее можно поручить субъекту или объекту, который не обязан вникать в существо дела, а возможно, и не способен его понять. Такой субъект или объект принято называть формальным исполнителем. Примером формального исполнителя может служить стиральная машина-автомат, которая неукоснительно исполняет предписанные ей действия, даже если вы забыли положить в нее порошок. Человек тоже может выступать в роли формального исполнителя, но в первую очередь формальными исполнителями являются различные автоматические устройства, и компьютер в том числе. Каждый алгоритм создается в расчете на вполне конкретного исполнителя. Те действия, которые может совершать исполнитель, называются его его допустимыми действиями . Совокупность допустимых действий образует систему команд исполнителя. Алгоритм должен содержать только те действия, которые допустимы для данного исполнителя.

Объекты, над которыми исполнитель может совершать действия, образуют так называемую среду исполнителя. Для алгоритмов, встречающихся в математике, средой того или иного исполнителя могут быть числа разной природы - натуральные, действительные и т.п., буквы, буквенные выражения, уравнения, тождества и т.п.

Данное выше определение алгоритма нельзя считать строгим - не вполне ясно, что такое "точное предписание" или "последовательность действий, обеспечивающая получение требуемого результата". Поэтому обычно формулируют несколько общих свойств алгоритмов, позволяющих отличать алгоритмы от других инструкций.

Такими свойствами являются:

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

    Определенность - каждое правило алгоритма должно быть четким, однозначным и не оставлять места для произвола. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.

    Результативность (конечность) - алгоритм должен приводить к решению задачи за конечное число шагов.

    Массовость - алгоритм решения задачи разрабатывается в общем виде, то есть, он должен быть применим для некоторого класса задач, различающихся только исходными данными. При этом исходные данные могут выбираться из некоторой области, которая называется областью применимости алгоритма.

На основании этих свойств иногда дается определение алгоритма, например: “Алгоритм – это последовательность математических, логических или вместе взятых операций, отличающихся детерменированностью, массовостью, направленностью и приводящая к решению всех задач данного класса за конечное число шагов.” Такая трактовка понятия “алгоритм” является неполной и неточной. Во-первых, неверно связывать алгоритм с решением какой-либо задачи. Алгоритм вообще может не решать никакой задачи. Во-вторых, понятие “массовость” относится не к алгоритмам как к таковым, а к математическим методам в целом. Решение поставленных практикой задач математическими методами основано на абстрагировании – мы выделяем ряд существенных признаков, характерных для некоторого круга явлений, и строим на основании этих признаков математическую модель, отбрасывая несущественные признаки каждого конкретного явления. В этом смысле любая математическая модель обладает свойством массовости. Если в рамках построенной модели мы решаем задачу и решение представляем в виде алгоритма, то решение будет “массовым” благодаря природе математических методов, а не благодаря “массовости” алгоритма.

Разъясняя понятие алгоритма, часто приводят примеры “бытовых алгоритмов”: вскипятить воду, открыть дверь ключом, перейти улицу и т. д.. : рецепты приготовления какого-либо лекарства или кулинарные рецепты являются алгоритмами. Но для того, чтобы приготовить лекарство по рецепту, необходимо знать фармакологию, а для приготовления блюда по кулинарному рецепту нужно уметь варить. Между тем исполнение алгоритма – это бездумное, автоматическое выполнение предписаний, которое в принципе не требует никаких знаний. Если бы кулинарные рецепты представляли собой алгоритмы, то у нас просто не было бы такой специальности – повар.

Правила выполнения арифметических операций или геометрических построений представляют собой алгоритмы. При этом остается без ответа вопрос, чем же отличается понятие алгоритма от таких понятий, как “метод”, “способ”, “правило”. Можно даже встретить утверждение, что слова “алгоритм”, “способ”, “правило” выражают одно и то же (т.е. являются синонимами), хотя такое утверждение, очевидно, противоречит “свойствам алгоритма”.

Само выражение “свойства алгоритма” некорректно. Свойствами обладают объективно существующие реальности. Можно говорить, например, о свойствах какого-либо вещества. Алгоритм – искусственная конструкция, которую мы сооружаем для достижения своих целей. Чтобы алгоритм выполнил свое предназначение, его необходимо строить по определенным правилам. Поэтому нужно говорить не о свойствах алгоритма, а о правилах построения алгоритма, или о требованиях, предъявляемых к алгоритму.

Первое правило – при построении алгоритма прежде всего необходимо задать мно-жество объектов, с которыми будет работать алгоритм. Формализованное (закодирован-ное) представление этих объектов носит название данных. Алгоритм приступает к работе с некоторым набором данных, которые называются входными, и в результате своей рабо-ты выдает данные, которые называются выходными. Таким образом, алгоритм пре-образует входные данные в выходные.

Это правило позволяет сразу отделить алгоритмы от “методов” и “способов”. Пока мы не имеем формализованных входных данных, мы не можем построить алгоритм.

Второе правило – для работы алгоритма требуется память. В памяти размещаются входные данные, с которыми алгоритм начинает работать, промежуточные данные и выходные данные, которые являются результатом работы алгоритма. Память является дискретной, т.е. состоящей из отдельных ячеек. Поименованная ячейка памяти носит на-звание переменной. В теории алгоритмов размеры памяти не ограничиваются, т. е. счита-ется, что мы можем предоставить алгоритму любой необходимый для работы объем памяти.

В школьной “теории алгоритмов” эти два правила не рассматриваются. В то же время практическая работа с алгоритмами (программирование) начинается именно с реализации этих правил. В языках программирования распределение памяти осуществляется декларативными операторами (операторами описания переменных). В языке Бейсик не все переменные описываются, обычно описываются только массивы. Но все равно при запуске программы транслятор языка анализирует все идентификаторы в тексте программы и отводит память под соответствующие переменные.

Третье правило – дискретность. Алгоритм строится из отдельных шагов (действий, операций, команд). Множество шагов, из которых составлен алгоритм, конечно.

Четвертое правило – детерменированность. После каждого шага необходимо указывать, какой шаг выполняется следующим, либо давать команду остановки.

Пятое правило – сходимость (результативность). Алгоритм должен завершать работу после конечного числа шагов. При этом необходимо указать, что считать результатом работы алгоритма.

Итак, алгоритм – неопределяемое понятие теории алгоритмов. Алгоритм каждому определенному набору входных данных ставит в соответствие некоторый набор выходных данных, т. е. вычисляет (реализует) функцию. При рассмотрении конкретных вопросов в теории алгоритмов всегда имеется в виду какая-то конкретная модель алгоритма.

Любая работа на компьютере – это есть обработка информации. Работу компьютера можно схематически изобразить следующим образом:

“Информация” слева и “информация” справа – это разные информации. Компьютер воспринимает информацию извне и в качестве результата своей работы выдает новую информацию. Информация, с которой работает компьютер, носит название “данные”.

Компьютер преобразует информацию по определенным правилам. Эти правила (операции, команды) заранее занесены в память компьютера. В совокупности эти правила преобразования информации называются алгоритмом. Данные, которые поступают в компьютер, называются входными данными. Результат работы компьютера – выходные данные. Таким образом, алгоритм преобразует входные данные в выходные:


Теперь можно поставить вопрос: а может ли человек обрабатывать информацию? Конечно, может. В качестве примера можно привести обычный школьный урок: учитель задает вопрос (входные данные), ученик отвечает (выходные данные). Самый простой пример: учитель дает задание – умножить 6 на 3 и результат написать на доске. Здесь числа 6 и 3 – входные данные, операция умножения – алгоритм, результат умножения – выходные данные:


Вывод: решение математических задач – частный случай преобразования информации. Компьютер (по-английски означает вычислитель, на русском языке – ЭВМ, электронная вычислительная машина) был создан как раз для выполнения математических расчетов.

Рассмотрим следующую задачу.

Длина класса 7 метров, ширина – 5 метров, высота – 3 метра. В классе 25 учеников. Сколько кв. м площади и сколько куб. м воздуха приходится на одного ученика?

Решение задачи:

1. Вычислить площадь класса:

2. Вычислить объем класса:

3. Вычислить, сколько квадратных метров площади приходится на одного ученика:

4. Вычислить, сколько куб. метров воздуха приходится на одного ученика:

105: 25 = 4,2
Ответ: на одного ученика приходится 1,4 кв. метров площади и 4,2 куб. метров воздуха.

Если теперь убрать вычисления и оставить только “действия”, то получим алгоритм – перечень операций, которые необходимо выполнить, чтобы решить данную задачу.

Получается, что при решении любой математической задачи мы составляем алгоритм решения. Но прежде мы сами и выполняли этот алгоритм, то есть доводили решение до ответа. Теперь же мы будем только писать, что нужно сделать, но вычисления проводит не будем. Вычислять будет компьютер. Наш алгоритм будет представлять собой набор указаний (команд) компьютеру.

Когда мы вычисляем какую-либо величину, мы записываем результат на бумаге. Компьютер записывает результат своей работы в память в виде переменной. Поэтому каждая команда алгоритма должна включать указание, в какую переменную записывается результат. Алгоритм решения нашей задачи будет выглядеть так:

1. Вычислить площадь класса и записать в переменную S.

2. Вычислить объем класса и записать в переменную V.

3. Вычислить, сколько квадратных метров площади приходится на одного ученика и записать в переменную S1.

4. Вычислить, сколько куб. метров воздуха приходится на одного ученика и записать в переменную V1.

5. Вывести на экран значения переменных S1 и V1.

Теперь остается только перевести команды алгоритма с русского языка на язык, понятный компьютеру, и получится программа. Программирование – это есть перевод алгоритма с “человеческого” языка на “компьютерный” язык.

Трактовка работы алгоритма как преобразования входных данных в выходные естественным образом подводит нас к рассмотрению понятия “постановка задачи”. Для того, чтобы составить алгоритм решения задачи, необходимо из условия выделить те величины, которые будут входными данными и четко сформулировать, какие именно величины требуется найти. Другими словами, условие задачи требуется сформулировать в виде “Дано... Требуется” – это и есть постановка задачи.

Алгоритм применительно к вычислительной машине – точное предписание, т.е. набор операций и правил их чередования, при помощи которого, начиная с некоторых исходных данных, можно решить любую задачу фиксированного типа.

Виды алгоритмов как логико-математических средств отражают указанные компоненты человеческой деятельности и тенденции, а сами алгоритмы в зависимости от цели, начальных условий задачи, путей ее решения, определения действий исполнителя подразделяются следующим образом:

    Механические алгоритмы , или иначе детерминированные, жесткие (например алгоритм работы машины, двигателя и т.п.);

    Гибкие алгоритмы , например стохастические, т.е. вероятностные и эвристические.

Механический алгоритм задает определенные действия, обозначая их в единственной и достоверной последовательности, обеспечивая тем самым однозначный требуемый или искомый результат, если выполняются те условия процесса, задачи, для которых разработан алгоритм.

    Вероятностный (стохастический) алгоритм дает программу решения задачи несколькими путями или способами, приводящими к вероятному достижению результата.

    Эвристический алгоритм (от греческого слова “эврика”) – это такой алгоритм, в котором достижение конечного результата программы действий однозначно не предопределено, так же как не обозначена вся последовательность действий, не выявлены все действия исполнителя. К эвристическим алгоритмам относят, например, инструкции и предписания. В этих алгоритмах используются универсальные логические процедуры и способы принятия решений, основанные на аналогиях, ассоцияциях и прошлом опыте решения схожих задач.

    Линейный алгоритм – набор команд (указаний), выполняемых последовательно во времени друг за другом.

    Разветвляющийся алгоритм – алгоритм, содержащий хотя бы одно условие, в результате проверки которого ЭВМ обеспечивает переход на один из двух возможных шагов.

    Циклический алгоритм – алгоритм, предусматривающий многократное повторение одного и того же действия (одних и тех же операций) над новыми исходными данными. К циклическим алгоритмам сводится большинство методов вычислений, перебора вариантов.

Цикл программы – последовательность команд (серия, тело цикла), которая может выполняться многократно (для новых исходных данных) до удовлетворения некоторого условия.

На рисунке продемонстрированы в условных обозначениях схемы основных конструкций алгоритмов:

а). линейного алгоритма;

б,в,г). разветвляющихся алгоритмов (б-ответвление, в-раздвоение, г-переключение);

д,е,ж). циклических алгоритмов (д,ж-проверка в начале цикла, е-проверка в конце цикла).

Вспомогательный (подчиненный) алгоритм (процедура) – алгоритм, ранее разработанный и целиком используемый при алгоритмизации конкретной задачи. В некоторых случаях при наличии одинаковых последовательностей указаний (команд) для различных данных с целью сокращения записи также выделяют вспомогательный алгоритм.

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

Структурная (блок-, граф-) схема алгоритма – графическое изображение алгоритма в виде схемы связанных между собой с помощью стрелок (линий перехода) блоков – графических символов, каждый из которых соответствует одному шагу алгоритма. Внутри блока дается описание соответствующего действия.

Графическое изображение алгоритма широко используется перед программированием задачи вследствие его наглядности, т.к. зрительное восприятие обычно облегчает процесс написания программы, ее корректировки при возможных ошибках, осмысливание процесса обработки информации.

Можно встретить даже такое утверждение: “Внешне алгоритм представляет собой схему – набор прямоугольников и других символов, внутри которых записывается, что вычисляется, что вводится в машину и что выдается на печать и другие средства отображения информации “. Здесь форма представления алгоритма смешивается с самим алгоритмом.

Принцип программирования “сверху вниз” требует, чтобы блок-схема поэтапно конкретизировалась и каждый блок “расписывался” до элементарных операций. Но такой подход можно осуществить при решении несложных задач. При решении сколько-нибудь серьезной задачи блок-схема “расползется” до такой степени, что ее невозможно будет охватить одним взглядом.

Блок-схемы алгоритмов удобно использовать для объяснения работы уже готового алгоритма, при этом в качестве блоков берутся действительно блоки алгоритма, работа которых не требует пояснений. Блок-схема алгоритма должна служить для упрощения изображения алгоритма, а не для усложнения.

При решении задач на компьютере необходимо не столько умение составлять алгоритмы, сколько знание методов решения задач (как и вообще в математике) . Поэтому изучать нужно не программирование как таковое (и не алгоритмизацию), а методы решения математических задач на компьютере. Задачи следует классифицировать не по типам данных, как это обычно делается (задачи на массивы, на символьные переменные и т. д.), а по разделу “Требуется”.

В информатике процесс решения задачи распределяется между двумя субъектами: программистом и компьютером. Программист составляет алгоритм (программу), компьютер его исполняет. В традиционной математике такого разделения нет, задачу решает один человек, который составляет алгоритм решения задачи и сам выполняет его. Сущность алгоритмизации не в том, что решение задачи представляется в виде набора элементарных операций, а в том, что процесс решения задачи разбивается на два этапа: творческий (программирование) и не творческий (выполнение программы). И выполняют эти этапы разные субъекты – программист и исполнитель

В учебниках по информатике обычно пишут, что исполнителем алгоритма может быть и человек. На самом деле алгоритмы для людей никто не составляет (не будем забывать, что не всякий набор дискретных операций является алгоритмом). Человек в принципе не может действовать по алгоритму. Выполнение алгоритма – это автоматическое, бездумное выполнение операций. Человек всегда действует осмысленно. Для того, чтобы человек мог выполнять какой-то набор операций, ему нужно объяснить, как это делается. Любую работу человек сможет выполнять только тогда, когда он понимает, как она выполняется.

Вот в этом – “ объяснение и понимание” – и кроется различие между понятиями “алгоритм” и “способ”, “метод”, “правило”. Правила выполнения арифметических операций – это именно правила (или способы), а не алгоритмы. Конечно, эти правила можно изложить в виде алгоритмов, но толку от этого не будет. Для того, чтобы человек смог считать по правилам арифметики, его нужно научить. А если есть процесс обучения, значит, мы имеем дело не с алгоритмом, а с методом.

При составлении алгоритма программист никому ничего не объясняет, а исполнитель не пытается ничего понять. Алгоритм размещается в памяти компьютера, который извлекает команды по одной и исполняет их. Человек действует по другому. Чтобы решить задачу, человеку требуется держать в памяти метод решения задачи в целом, а воплощает этот метод каждый по-своему.

Очень ярко эта особенность человеческой психологии – неалгоритмичность мышления – проявилась в методичесом пособии А. Г. Гейна и В. Ф. Шолоховича. В пособии излагаются решения задач из известного учебника. Решения задач должны быть представлены в виде алгоритмов. Однако авторы пособия понимают, что если просто написать алгоритм решения задачи, то разобраться в самом решении будет трудно. Поэтому они сначала приводят “нечеткое изложение алгоритма” (т. е. объясняют решение задачи), а затем пишут сам алгоритм.



Л И Т Е Р А Т У Р А

1. Нестеренко А. В. ЭВМ и профессия программиста.

М., Просвещение, 1990.

2. Брудно А. Л., Каплан Л. И. Московские олимпиады по программированию.

М., Наука, 1990.

3. Кузнецов О. П., Адельсон-Вельский Г. М. Дискретная математика для инженера.

М., Энергоатомиздат, 1988.

4. Гейн А.Г. и др.. Основы информатики и вычислительной техники.

М., Просвещение, 1994.

5. Информатика. Еженедельное приложение к газете “Первое сентября”. 1998, № 1.

6. Радченко Н. П. Ответы на вопросы выпускных экзаменов. – Инфоматика и

образование, 1997, №4.

7. Касаткин В.Н. Информация, алгоритмы, ЭВМ. М., Просвещение, 1991.

8. Каныгин Ю. М., Зотов Б. И. Что такое информатика?

М., Детская литература, 1989.

9. Гейн А. Г., Шолохович В.Ф. Преподавание курса “Основы информатики и вычислительной техники” в средней школе. Руководство для учителя.

Екатеринбург, 1992.

10. Извозчиков В.А. Информатика в понятиях и терминах.

11. Газета «Информатика», №35, 1997г.

12. Л.З. Шауцуков Основы информатики в вопросах и ответах.


Автор: Богашова Татьяна, Донец Сергей (КПИ,ФАКС) г.Киев, 1999г.
Оценка:отл.
Сдавался: ПТУ №34
E-Mail:[email protected]