- •Алгоритм
- •Характеристические свойства алгоритмов
- •Примеры алгоритмов
- •A. Алгоритм сложения двух положительных десятичных чисел
- •B. Алгоритм разложения натурального числа на простые множители
- •C. Алгоритм вставки карточки в (упорядоченную) картотеку
- •D. Алгоритм сортировки (несортированной) картотеки
- •F. Алгоритм вычисления числа е (т. Е. Вычисления последовательности дробей — приближения для е)
- •G. Алгоритм, распознающий, можно ли получить последовательность знаков a из последовательности знаков ь посредством вычёркивания некоторых знаков
- •Рекурсия и итерация
- •Специальные формы описания алгоритмов
- •Алгоритмы Маркова
G. Алгоритм, распознающий, можно ли получить последовательность знаков a из последовательности знаков ь посредством вычёркивания некоторых знаков
Если а — пустая последовательность знаков, то ответом будет «да». В противном случае нужно посмотреть, не пуста ли последовательность Ь. Если это так, то ответом будет «нет». Иначе нужно сравнить первый знак последовательности а с первым знаком последовательности Ь. Если они совпадают, то надо снова применить тот же алгоритм к остатку последовательности а и остатку последовательности Ь. В противно случае нужно снова применить тот же алгоритм к исходной последовательности а и остатку последовательности Ь.
Пример. Последовательность 001100 можно получить из последовательности 010101010, например, так: 010101010.
Это алгоритм выдаёт двузначный результат, «да» или «нет», т. е. он является алгоритмом распознавания свойства «быть частью данной последовательности знаков». Заметим, что распознавание того, является ли а (связным ) подсловом b, — вещь более сложная.
Упражнение. Приведите нетривиальные примеры последовательностей, которые можно (нельзя) получить друг из друга.
В случаях C и D речь идет о недетерминистических и, вообще говоря, недетерминированных алгоритмах. Все другие являются примерами детерминистических алгоритмов, причем все, кроме F, завершающиеся.
Рекурсия и итерация
В последнем примере мы имеем наиболее простой случай: количество элементарных шагов обработки постоянно и не зависит от чисел а и b. Иначе обстоит дело в других примерах: в случае А это количество зависит от разрядности большего слагаемого, в случае B —от величины разлагаемого числа, в случаях C и D—от размера картотеки, а в случае F оно бесконечно. Хотя описание алгоритма конечно и постоянно, количество фактически выполняемых шагов — величина переменная; это оказывается возможным благодаря использованию приёма, сводящего общую задачу к „более простой" задаче того же класса. Этот трюк называю рекурсией. В примерах C и D наличие рекурсии очевидно из самого словесного описания алгоритма. В примерах A, B и G мы имеем специальный случай рекурсии — повторительную рекурсию. При словесном описании ее часто записывают, как например, в случае B, в форме итерации: «Пока выполнено определённое условие, повторяй...». В примере F речь идёт о безусловном (не зависящем от выполнения какого-либо условия) повторении.
Рекурсия — это широко распространённый метод, понятный без математической формализации, интуитивно близкий любому «человеку с улицы». Для рекурсии в ее наиболее общей, неитеративной форме типична необходимость отсрочки некоторых действий; см., в частности, пример D. По этой причине он вряд ли показан для забывчивых людей, но вполне пригоден для подходящим образом оборудованных машин. Повторение же — это в значительной степени наш повседневный опыт.
Наряд с рекурсией и повторением в алгоритмах встречается также разбор возможных случаев; см. G. Без разбора отдельных случаев, в частности, было бы невозможно окончание рекурсивных алгоритмов; см. C, D, G.
Специальные формы описания алгоритмов
Машина Тьюринга (структура, такт работы, запись программы, правила выполнения программы, применимость и неприменимость алгоритма к слову, соглашения для сокращения записи программы). Возможности МТ (композиция, разветвление и повторение МТ) Тезис Тьюринга.
Алгоритмически неразрешимые проблемы (определение алгоритмически разрешимых и неразрешимых задач, понятия записи алгоритма и самоприменимости, теорема об алгоритмической неразрешимости проблемы самоприменимости)
Алгоритмы обрабатывают определённые объекты („входные") и выдают объекты („выходные") в качестве результатов. Объекты могу быть конкретными, как, например, десятичное число в случае A. Объекты могут быть абстрактными, как, скажем, натуральные числа (для которых могут использоваться разнообразные эквивалентные системы представления) в случае B — для описанного там алгоритма совершенно несущественно, записываются числа в десятичной или двоичной системе счисления или даже римскими цифрами, свойства делимости от этого не меняются. В теоретических исследованиях предпочитают опираться на алгоритмы, которые работают, например, только с натуральными числами (Гёдель), либо только с цепочками знаков (Марков). С практической точки зрения нет никакой пользы или нужды в таких ограничениях, допустимы какие угодно множества объектов, если только можно аккуратно определить их свойства. Разве лишь, поскольку приходится привлекать разбор отдельных случаев, необходимо включить в множество объектов по крайней мере значения истинности «истина» и «ложь».
В зависимости от того, какие допускаются классы объектов (соответствующие операции), приходят к различным классам алгоритмов.
