Статья опубликована в журнале "Программист", 2002. №8. C.82-90.
Анатолий Шалыто,
Никита Туккель,
Никита Шамгунов
Отсюда можно скачать полный текст статьи в формате pdf (191 кб)
Аннотация
Одной из наиболее известных рекурсивных задач является задача о ханойских башнях [1-5], которая формулируется следующим образом. Имеются три стержня, на первом из которых размещено N дисков. Диск наименьшего диаметра находится сверху, а ниже - диски последовательно увеличивающегося диаметра. Задача состоит в определении последовательности перекладываний по одному диску со стержня на стержень, которые должны выполняться так, чтобы диск большего диаметра никогда не размещался выше диска меньшего диаметра и чтобы, в конце концов, все диски оказались на другом стержне.
В рассматриваемой работе показано, что применение автоматов [6] позволяет формально переходить к итеративным алгоритмам решения этой задачи, либо строить такие алгоритмы непосредственно. В работах [7,8] приведены примеры преобразований рекурсивных программ в итеративные, однако подходы, обеспечивающие такие преобразования, не формализованы. Настоящая работа призвана устранить этот пробел.
В статье предлагаются три метода. Первый из них обеспечивает формальное построение автоматной программы (программы, построенной с использованием автоматов) на основе раскрытия рекурсии с применением стека. Второй метод также обеспечивает раскрытие рекурсии и состоит в построении автомата, осуществляющего обход дерева действий, выполняемых рекурсивной программой. Третий метод состоит в непосредственном управлении стержнями с помощью автомата и не использует таких абстракций как деревья и стеки. Отметим, что применение каждого из предлагаемых методов для рассматриваемой задачи порождает автоматы с двумя или тремя состояниями, управляющие "объектом управления" с 2N состояниями, возникающими в процессе перекладывания дисков.
Литература
-
Седжвик Р. Фундаментальные алгоритмы на С++. Киев: ДиаСофт, 2001.
-
Грэхем Р., Кнут Д., Поташник О. Конкретная математика. М.: Мир, 1998.
-
Романовский И.В., Столяр С.Е. Стек и его использование. http://ips.ifmo.ru.
-
Гарднер М. Математические головоломки и развлечения. М.: Мир, 1971.
-
Бобак И. Алгоритмы: "возврат назад" и "разделяй и влавствуй" //Программист. 2002. №3.
-
Шалыто А.А., Туккель Н.И. От тьюрингова программирования к автоматному //Мир ПК. 2002. №2.
-
Стивенс Р. Delphi. Готовые алгоритмы. М.: ДМК, 2001.
-
Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и алгоритмы. М.: Вильямс, 2000.
|