Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рекурсивные алгоритмы.doc
Скачиваний:
3
Добавлен:
05.11.2018
Размер:
400.9 Кб
Скачать

Задача о Ханойских башнях.

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

Постановка задачи:

Даны три столбика – A, B, C. На столбике A один на другом находятся n дисков разного диаметра, пронумерованные сверху вниз. Причем они располагаются так, что каждый меньший диск находится на большем. Требуется переместить эти n дисков на столбик C, сохранив их взаиморасположение. Столбик B разрешается использовать как вспомогательный. При решении за один шаг допускается перемещать только один из верхних дисков какого-либо столбика. Кроме того, больший диск никогда не разрешается класть на диск меньшего диаметра.

Для определения подхода к решению поставленной задачи рассмотрим общий случай. Если мы сможем сформулировать решение для n дисков в терминах решения для n-1 диска, то поставленная проблема была бы решена, поскольку задачу для n-1 диска можно будет, в свою очередь, решить в терминах n-2 дисков и так далее до тривиального случая одного диска. А для случая одного диска (n=1) решение получается элементарным. Нужно просто переместить один-единственный диск со столбика A на столбик C.

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

if (n==1)

Переместить этот единственный диск со столбика A на столбик C и остановиться ;

else

  1. Переместить верхние n-1 диск со столбика a на столбик b, используя столбик c как вспомогательный.

  2. Переместить оставшийся нижний диск со столбика a на столбик c.

  3. Переместить n-1 диск со столбика b на столбик c, используя столбик a как вспомогательный.

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

Если n=1, то корректность очевидна. Если n=2, то мы знаем, что уже имеем решение для случая (n-1)–го диска, которое равно 1. Аналогично, если n=3, мы снова имеем решение для (n-1) диска, которое равно 2. Подобным образом можно показать, что это решение работает для n=1,2,3,4,5… и какого-либо другого n.

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

Пример 3:

-------------------------------------------------------------------------------------------------------

void Move_Disks (int n, char Source, char Dest, char Temp)

{

if (n==1) //если имеется только 1 диск, то это //элементарно

{

fprintf(st1,"Переставить диск номер 1 со столбика %c на столбик %c\n",Source,Dest);

}

else //иначе:

{//сначала перемещаем n-1 диск со столбика A на //столбик B, используя столбик C как вспомогательный

Move_Disks(n-1,Source,Temp,Dest);//вызов процедуры из //самой себя, или рекурсия

fprintf(st1,"Переставить диск номер %d со столбика %c на столбик %c\n",n,Source,Dest);

//затем перемещаем n-1 диск со столбика B на столбик //C, используя столбик A как вспомогательный

Move_Disks(n-1,Temp,Dest,Source);//вызов процедуры из //самой себя, или рекурсия

return;//возврат из ф-ии

}

}

-------------------------------------------------------------------------------------------------------

Лемма 2. Рекурсивный алгоритм «разделяй и властвуй» решения задачи о ханойских башнях дает решение, приводящее к 2^n-1 перемещениям.

Как обычно, из кода немедленно следует, что количество перемещений удовлетворяет условию рекурентности. В данном случае количество перемещений дисков, удовлетворяющее условию рекурентности, определяется формулой: