У нас тоже стала накапливаться своя библиотека, в ней уже три алгоритма - "Спинка кофточки", "Погрузка корабля" и "Спящая красавица". Пусть не смущает вас, читатель, их несерьезный, потешный характер: потешные солдаты Петра Первого составили потом ядро его гвардии.
Со всем уважением присмотримся к алгоритмам нашей библиотеки. Каждый более всего похож на цепь, звеньями которой являются операции. Почти все операции - прямые команды, они начинаются глаголами в повелительном наклонении: "найти", "взять", "поделить", "вставить", "скопировать", "отбросить", "вязать".
Цепь операций-команд нигде не прерывается; добавляя к ней звено за звеном, мы можем изобразить во всех подробностях ход самой трудоемкой работы.
Весной 1616 года придворные французского короля Людовика XIII собрались на лужайке парка Фонтенеб-ло, чтобы познакомиться с диковинными автоматами. Автомат-мушкетер в плаще и в шляпе с пером невозмутимо шагал по лугу, останавливался, извлекая шпагу из ножен, салютовал ею придворным и четко, даже щегольски отправлял шпагу на место. Автомат-пастушка нежно улыбалась, двигалась плавно и женственно, закатывала глаза и произносила голосом, напоминавшим свирель: "Да здравствует король!" Автомат-утка по понятным причинам не приветствовала короля, зато крякала, переваливалась с боку на бок, входила в пруд и - смотрите! - плыла по глади вод, перебирая перепончатыми лапками.
- Люди и животные сделаны из железа, а ведут себя как живые! - удивлялись придворные.
Вместе с ними удивлялся и бретонский дворянин Рене Декарт, хрупкий юноша, способный не только удивляться, но и тщательно обдумывать удивительные вещи, пристально рассматривать их в естественном свете разума.
"Очаровательные игрушки, - думал Р. Декарт, - изысканные, остроумные создания механиков-часовщиков! В воле мастеров сделать автоматы посложнее, добавить несколько зубчатых колес. Тогда "мушкетер" подружится с "пастушкой", а "утка" станет повторять "Да здравствует любовь!". Нет запрета еще и еще совершенствовать автоматы. Скажем, изобрести автомат, который безошибочно владеет придворным этикетом, шаблонными светскими речами. Этот механический господин стоял бы среди нас и ничем бы от нас не отличался: точно так же улыбался бы, двигался, восхищался королевскими затеями, снисходительно хвалил бы другие автоматы, кровных своих братьев. Скрытая в теле автомата цепь обязательных действий может быть сколь угодно длинной и разматываться сколь угодно долго..."
Так размышлял юноша об алгоритмах работы автоматов вообще, и автомата-придворного, в частности. Сегодня мы полностью согласны с Р. Декартом. Сегодня место громоздких зубчаток заняла микроэлектроника, а алгоритмические цепи содержат сотни тысяч и миллионы, звеньев - команд... Но вернемся к размышлениям Р. Декарта.
"Цепь может разматываться сколь угодно долго, и все действия автомата будут выглядеть разумно, словно он обладает душой. Выходит, цепь команд заменяет душу?:
Юноша закусил губу и продолжал смотреть на королевские игрушки. Ему вдруг совсем по-детски захотелось подбежать к "мушкетеру" да потихоньку вытащить у него шпагу из ножен. Автомат не заметит, не поймет, не остановится, а по-прежнему будет механически извлекать отсутствующее оружие, салютовать ничем. Его поведение потеряет всякий смысл. Если сей воин даже встретит на своем пути стену, он не свернет, а продолжит свой марш напролом. Смешно и нелепо!
"Нелепости вполне можно избежать, - решил внезапно Р. Декарт, - только одно требуется для этого: чтобы автомат проверял самого себя. "Мушкетер", прежде чем обнажать шпагу, должен бы ответить на вопрос: "Шпага в ножнах?" Если да, действовать решительно, а если нет, обратиться, положим, к окружающим: верните, мол, мое оружие. И стена автомату не страшна. Время от времени он обязан проверять: "Дорога свободна?" Если да, не останавливаться, а если нет, поискать другого пути".
Итак, серьезный алгоритм наряду с повелительными предложениями должен содержать и предложения вопросительные. Заглянем в нашу библиотечку. Операции-вопросы, хоть их и немного, сразу бросаются в глаза: "Данное слово входит в словарь?", "Красавица здесь?"
Сразу бросается в глаза и особенность этих вопросов: они поставлены в такой плоскости, что допускают только два ответа - "да" и "нет". Слово или входит в словарь, или не входит в него; красавица или в этой части царства, или не в этой, а в другой, не в Баклушах, а в Балясах. И у "мушкетера" шпага либо в ножнах, либо ее мысленно извлек оттуда юный Р. Декарт.
Лет через десять после памятного осмотра автоматов Р. Декарт написал небольшую работу под названием "Правила для руководства ума". В этих правилах, адресованных людям, философ особое внимание уделял отчетливому пониманию того, что мы действительно хотим отыскать, задавая вопрос, и того, что лишь отдаленно связано с вопросом. "Человеческий ум подвержен двоякого рода заблуждению, - говорит Р. Декарт. - Или он захватывает больше, чем надо для определения какого-либо вопроса, или, наоборот, что-нибудь упускает".
Алгоритм п заблуждения несовместимы. Именно поэтому в алгоритм пропускаются лишь очень строгие и четкие вопросы. Здесь днем с огнем не сыщешь вопросов вроде "Что есть истина?", "Как быть дальше?" или "Можно ли побороть несправедливость?", Здесь не м&
сто ни темным, ни вечным, ни проклятым вопросам. Вопрос здесь прям, ясен и прозрачен. Он требует обязательного и недвусмысленного ответа: "да" или "нет".
Казалось бы, алгоритмист добровольно связал себе руки, выбрав из всего многоцветья возможных ответов только "да" или "нет". Попадется ему мудреная задача, а он, того и гляди, не сумеет придумать соответствующие проверки, поставить правильные вопросы. Теория алгоритмов утверждает: сумеет - этих "да" или "нет" достаточно для решения любой, обратите внимание, любой проблемы.
Многократно и искусно используя "да" или "нет", удается обойти любое препятствие, добраться до любой цели, где бы она ни пряталась. Помните, в поисках Спящей красавицы нам помогла вещая птица? Птица, видимо, знала толк в алгоритмировании - отвечала только "да" и "нет" и была уверена, что этого достаточно.
Алгоритм не простая цепь команд, а цепь с проверками и ветвлениями. Гибкость алгоритмов, их сила, их величие основаны на проверках и ветвлениях. После каждой проверки - два пути, которые могут навсегда разойтись или вновь пересечься спустя несколько шагов. Один путь, бывает, сразу приводит к цели, зато по другому еще шагать и шагать. Один прям как стрела, а другой вроде и не стремится вперед, наоборот, он изгибается, он возвращает нас к уже пройденным операциям, он похож на петлю. Двигаясь по такому пути, мы, кажется, совсем близки к решению, и вдруг - поворачивай оглобли, отправляйся назад, к истокам задачи. Зачем проторен попятный путь здесь, в целеустремленном алгоритме?..
Отдел кадров большого завода... Кадровики обращаются к вычислительной машине: отпечатай список всех наших мужчин в возрасте от 20 до 35 лет, которые не женаты. Машина, хранящая в своей памяти полный перечень рабочих и служащих завода, тотчас берет из него первую фамилию и придирчиво проверяет: мужчина? молодой? холост?
Если результат хотя бы одной проверки отрицательный, машина отвергает претендента; если же на все вопросы следует ответ "да", если претендент проходит по всем кондициям, машина заносит его фамилию в список.
И в любом случае возвращается к началу алгоритма: вновь извлекает очередную фамилию из списка, опять проверяет, снова то ли печатает ее, то ли пропускает - как проверка покажет. И опять упрямо поворачивает к истокам задачи.
Этот попятный путь, это повторение одних и тех же операций Ада Лавлейс назвала циклом.
Цикл работает методично, неумолимо, даже весело. Болконский Андрей. Мужчина? - Да. Молод? - Да. Холост? - Нет. Решение: Болконского Андрея в список не включать. Воробей Елизавет. Мужчина? - Нет. Молод? - Да. Холост? - Нет. Вывод: Воробья Елизавета не включать. Ленский Владимир: да, да, да - включить. Скотинин Митрофан: да, да, да - включить. Чацкий Александр: да, да, да - включить.
Цикл за циклом компьютер аккуратно проверяет весь перечень рабочих и служащих завода, добывая из него холостых. Последняя фамилия: Щукин Эрнест. Последние проверки. Мужчина? - Да. Молод? - Да. Холост? - Нет. Последнее решение: инженера Щукина в список не включать.
А дальше что? Машина не прекратит циклической работы, продолжит, как белка в колесе, свой уже ненужный бег. Как покинуть заколдованный круг, как выйти из цикла?
Опять с помощью проверки. Например, написать в конце перечня рабочих и служащих вслед за фамилией Щукин невероятную фамилию: Яяяяя. И включить в алгоритм последний вопрос: "Это фамилия, Яяяяя?" Если нет, продолжать циклическое действие, а если да, подвести черту под только что отпечатанным списком и остановиться.
Итак, цикл незаменим, когда предстоит монотонная, повторяющаяся работа. Редкий алгоритм обходится без монотонной работы, редкий алгоритм не содержит циклов. Циклами вооружены, например, все три образца нашей библиотечки алгоритмов.
Алгоритм "Спинка кофточки". Он буквально напичкан циклами: каждый ряд вязки описан циклически (выход из цикла - по числу петель); потом несколько рядов выполняются "рябушкой" (выход из цикла - число рядов достигло 4); потом предлагается чулочная вязка (выход из цикла - длина спинки равна 43 см)...
Алгоритм "Погрузка корабля". Здесь машина циклически проверяет допустимость товаров, которые протаскивают на корабль гости. Цикл, естественно, работает и тогда, когда компьютер сам загружает корабль: он извлекает слова из словаря точно так же, как машина отдела кадров добывала фамилии рабочих и служащих из перечня.