
- •«Рекурсивные алгоритмы» Содержание:
- •Теоретическое введение:
- •Тексты программ с комментариями;
- •Результаты выполнения программ. Теоретическое введение.
- •Задача поиска максимума.
- •Задача рисования меток на линейке.
- •Задача о Ханойских башнях.
- •Переместить верхние n-1 диск со столбика a на столбик b, используя столбик c как вспомогательный.
- •Переместить оставшийся нижний диск со столбика a на столбик c.
- •Переместить n-1 диск со столбика b на столбик c, используя столбик a как вспомогательный.
- •Тексты программ с комментариями.
- •Int Maximum(int a[10], int l, int r)//заголовок ф-ии
- •Результаты выполнения программ.
Задача о Ханойских башнях.
Ни одно рассмотрение рекурсии не было бы полным без рассмотрения старинной задачи о ханойских башнях.
Постановка задачи:
Даны три столбика – 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
-
Переместить верхние n-1 диск со столбика a на столбик b, используя столбик c как вспомогательный.
-
Переместить оставшийся нижний диск со столбика a на столбик c.
-
Переместить 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 перемещениям.
Как обычно, из кода немедленно следует, что количество перемещений удовлетворяет условию рекурентности. В данном случае количество перемещений дисков, удовлетворяющее условию рекурентности, определяется формулой: