|
В качестве иллюстрации - как "договаривались", не
вычислительной - приведем алгоритмизированное описание беседы
небезызвестного почтальона Печкина с Говорящим Галчонком. Нумерация
шагов в словесном описании алгоритма, соответствующей ему блок-схеме
(Рис. A1-1) и диаграмме (Рис.
A1-2) совпадает.
-
Почтальон Печкин стучит в дверь -
"тук-тук".
-
Если Галчонок слышит стук, то переход к
шагу 3, иначе - к шагу 1. {Если птица
глуховата или ее нет дома, то Печкину не позавидуешь.}
-
Галчонок: "Кто там?"
-
Если Печкин слышит вопрос "кто там?" {а
если глуховат сам почтальон, то дела его опять-таки
плачевны}, то переход к шагу 5, иначе - к шагу
1.
-
Печкин: "Это я, почтальон Печкин. Откройте
дверь. Я принес письмо для вашего Мальчика".
-
Если Галчонок открывает дверь {надеемся,
героической птице это по силам, а то вновь бедный Печкин в
безвыходном положении, поскольку процесс не завершится}, то
переход к шагу 7, иначе - переход к шагу
1.
-
Почтальон Печкин вручает конверт с письмом.
{Комментарии в скобках, здесь и выше,
призваны продемонстрировать, даже на столь простом примере,
как много подводных камней ждет программиста при отладке
программы, если алгоритм недостаточно продуман.}
|
Определяющей особенностью вычислительного процесса
является возможность расчленить его на отдельные, дискретные,
действия, чего нельзя сказать о процессе непрерывном. В дискретном
процессе Галчонок не может задать свой сакраментальный вопрос, пока
постукивание продолжается. Собственно говоря, "тук-тук" и не
обладает, с точки зрения алгоритма, протяженностью во времени. Это
событие мгновенно, в противном случае мы бы расчленили его на k отдельных "туков", а порядковые номера шагов,
начиная с третьего, увеличились бы на k-1.
 |
| Рис. 1. | |
 |
| Рис. 2. | |
Таким образом, второй особенностью является
последовательность действий процесса, оформленных как
предписания алгоритма. Здесь вновь имеет место важное
ограничение: т.н. параллельные алгоритмы остаются за
рамками обсуждения.
Предписаний должно быть конечное число; в
приведенном алгоритме их шесть. Каждое из них, в отдельности, должно
быть точным и не допускать неопределенного толкования.
Скажем, вопрос "кто там?" адресован вполне определенному источнику
стука, располагающемуся за пределами дома около двери.
Точное предписание вызывает шаг алгоритма.
Отдельные предписания могут исполняться неоднократно, поэтому
ограниченность набора инструкций в алгоритме отнюдь не гарантирует
обязательности его завершения. Так, если у почтальона и/или его
собеседника имеются проблемы со слухом, то количество шагов
алгоритма не только превысит число предписаний, но даже грозит стать
бесконечным (разумеется, только теоретически: у кого-то нервы не
выдержат). Поэтому обязательное требование состоит в том, что весь
процесс, включающий все шаги от начала до
завершения, должен быть конечен. Отметим попутно,
что в теории алгоритмов рассматриваются и, так называемые,
бесконечные алгоритмы, но они в наше поле зрения не
попадут.
Вообще говоря, не столь существенно, проводится ли
процесс, согласно алгоритму, именно компьютером. Содержание
предписаний таково, что их может осуществить человек, а иногда даже,
как видим, почти обыкновенные галки. Разница, если иметь в виду
собственно достижение результата, только в требуемом для
исполнения алгоритма времени. Следовательно, нужно отличать
теоретическую "мгновенность" шага алгоритма от реального времени
осуществления его вычислительным устройством. И даже
компьютеру может оказаться не по силам алгоритм, состоящий из
конечного, но столь большого числа шагов, что окончания работы
"заказчику", практически, не дождаться.
Естественно, процесс должен преследовать
конкретную цель, без чего постановка задачи с
алгоритмическим содержанием смысла не имеет. Так, бесцельный процесс
"переливания из пустого в порожнее" отнести к разряду
алгоритмических мы не рискнем.
Кроме того, цель должна быть достижимой.
Глухой Печкин, как мы уже выяснили, принужден стучать в дверь
бесконечно, так и не вручив письмо. К счастью, имея дело с кругом
задач дискретной математики, беспокоиться не о чем, поскольку для
них собственно факт существования решения, - то есть алгоритма
достижения поставленной цели, - редко подвергается сомнению.
Однако провести анализ алгоритма
разработчику следует, чтобы оценить, сколь велико оказывается число
шагов. Мораль ордена иезуитов, - "цель оправдывает средства", -
здесь не действует.
Как пишет Кнут, "программист может многому
научиться, прочитав хорошую поваренную книгу". Вероятно, он имел в
виду, что такое чтение стало бы неплохой тренировкой в поиске ошибок
и неточностей, связанных, в том числе, с разницей в бытовом и
"компьютерном" представлениях об алгоритме. Что ж, проведем, следуя
рекомендации, небольшую тренировку.
Назад
|