Рекурсия в задаче о Ханойской башне
Понятие рекурсии как вычислительного процесса направленного на решение определенной задачи в программировании. Структурно рекурсивная функция. Характеристика Ханойской башни. Алгоритм решения задачи о переносе башни и пример программного кода для решения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 28.08.2014 |
Размер файла | 21,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Рекурсия - вычислительный процесс, направленный на решение определенной задачи таким образом, что само решение использует этот же процесс, решающий аналогичную подзадачу.
В программировании рекурсия -- вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция вызывает функцию , а функция -- функцию . Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Рекурсивная программа позволяет описать повторяющееся или даже потенциально бесконечное вычисление, причём без явных повторений частей программы и использования циклов.
Структурно рекурсивная функция на верхнем уровне всегда представляет собой команду ветвления (выбор одной из двух или более альтернатив в зависимости от условия (условий), которое в данном случае уместно назвать «условием прекращения рекурсии»), имеющей две или более альтернативные ветви, из которых хотя бы одна является рекурсивной и хотя бы одна --терминальной. Рекурсивная ветвь выполняется, когда условие прекращения рекурсии ложно, и содержит хотя бы один рекурсивный вызов -- прямой или опосредованный вызов функцией самой себя. Терминальная ветвь выполняется, когда условие прекращения рекурсии истинно; она возвращает некоторое значение, не выполняя рекурсивного вызова. Правильно написанная рекурсивная функция должна гарантировать, что через конечное число рекурсивных вызовов будет достигнуто выполнение условия прекращения рекурсии, в результате чего цепочка последовательных рекурсивных вызовов прервётся и выполнится возврат.
Помимо функций, выполняющих один рекурсивный вызов в каждой рекурсивной ветви, бывают случаи «параллельной рекурсии», когда на одной рекурсивной ветви делается два или более рекурсивных вызова. Параллельная рекурсия типична при обработке сложных структур данных, таких как деревья. Простейший пример параллельно-рекурсивной функции -- вычисление ряда Фибоначчи, где для получения значения n-го члена необходимо вычислить (n-1)-й и (n-2)-й.
Ханойская башня является одной из популярных головоломок XIX века. Даны три стержня, на один из которых нанизаны восемь колец, причем кольца отличаются размером и лежат меньшее на большем. Задача состоит в том, чтобы перенести пирамиду из восьми колец за наименьшее число ходов на другой стержень. За один раз разрешается переносить только одно кольцо, причём нельзя класть большее кольцо на меньшее.
Эту игру придумал французский математик Эдуард Люка, в 1883 году, её продавали как забавную игрушку. Первоначально она называлась «Профессор Клаус (Claus) из Колледжа Ли-Су-Стьян (Li-Sou-Stian)», но вскоре обнаружилось, что таинственный профессор из несуществующего колледжа -- не более чем анаграмма фамилии изобретателя игры, профессора Люка (Lucas) из колледжа Сен-Луи (Saint Louis).
Предположим, что мы хотим получить в итоге программу, которая по заданному значению N будет нам выводить последовательность действий, решающих задачу, т.е. алгоритм переноса всех колец со стержня А на стержень B. Действие переноса одного кольца будет иметь вид: A -> B, что означает перенос одного верхнего кольца со стержня с именем А, на стержень с именем B. Рассмотрим, как должны выглядеть решения для малых N: рекурсия вычислительный ханойский башня
N=1: A -> B
N=2: A -> C, A -> B, C -> B
N=3: A -> B, A -> C, B -> C, A -> B, C -> A, C -> B, A -> B
Минимальное число ходов, необходимое для решения головоломки, равно 2n - 1, где n -- число дисков. Начнём с самого маленького кольца и переложим его на любую отметку. В дальнейшем это кольцо нужно перемещать в том же направлении, что и при первом перекладывании. Затем произведем единственно возможное перемещение оставшихся колец, после чего снова переложим самое маленькое кольцо и т. д. (Интересно заметить, что перенумеровав «кольца» по порядку, мы добьёмся неожиданного эффекта: чётные кольца будут перемещаться из одной вершины треугольника в другую в одном направлении, а нечётные -- в противоположном направлении.)
Назовем стержни левым (left), средним (middle) и правым (right). Задача состоит в переносе m дисков с левого стержня на правый.
Задача может быть решена одним перемещением только для одного (m = 1) диска. В общем случае потребуется 2m-1 перемещений.
Построим рекурсивное решение задачи, состоящее из трех этапов:
a) перенести башню, состоящую из m - 1 диска, с левого стержня на средний;
b) перенести один оставшийся диск с левого стержня на правый;
c) перенести башню, состоящую из m - 1 диска, со среднего стержня на правый.
Таким образом, задача о перемещении m дисков сводится к задаче о перемещении m - 1 диска. Обращаясь опять к этому же алгоритму, сведем задачу к перемещению m - 2 дисков. Продолжая этот процесс, получим, в конце концов, задачу о перемещении одного диска. Эта задача решается за один ход. Таким образом, в процессе решения возникают промежуточные задачи: переместить башню из нескольких n дисков с одного стержня на другой.
Обозначим тот стержень, с которого следует снять диски, через s1, на который надеть - через sk, а вспомогательный стержень через sw.
Оформим алгоритм решения задачи о переносе башни из n дисков с s1 на sk в виде процедуры move с 4-мя параметрами: n, s1, sw, sk; алгоритм для n = 1выделим в отдельную процедуру step, которая перемещает один диск со стержня s1на sk.
Тогда программный код будет выглядеть следующим образом:
type
st = (left, middle, right);
nat = 1..maxint;
var
m: nat; {m - число дисков}
procedure move(n: nat; s1, sw, sk: st); {перемещение n дисков с s1 на sk}
procedure step; {перемещение одного диска с s1 на sk}
procedure print(s: st);
begin
case s of
left: write(' лев. ');
middle: write(' средн. ');
right: write(' прав. ')
end;
end;
begin {step}
write(' снять диск с ');
print(s1);
write(' надеть на ');
print(sk);
writeln
end;
begin {move}
if n = 1 then
step
else begin
move(n - 1, s1, sk, sw);
step;
move(n-1, sw, s1, sk)
end
end;
begin
read(m); {число дисков}
writeln('для ', m:3, ' дисков следует произвести ',
'следующие действия:');
move(m, left, middle, right);
readln
end.
При тестировании программы получаются следующие результаты:
для 2 дисков следует произвести следующие действия:
снять диск с лев. надеть на средн.
снять диск с лев. надеть на прав.
снять диск с средн. надеть на прав.
для 3 дисков следует произвести следующие действия:
снять диск с лев. надеть на прав.
снять диск с лев. надеть на средн.
снять диск с прав. надеть на средн.
снять диск с лев. надеть на прав.
снять диск с средн. надеть на лев.
снять диск с средн. надеть на прав.
снять диск с лев. надеть на прав.
для 4 дисков следует произвести следующие действия:
снять диск с лев. надеть на средн.
снять диск с лев. надеть на прав.
снять диск с средн. надеть на прав.
снять диск с лев. надеть на средн.
снять диск с прав. надеть на лев.
снять диск с прав. надеть на средн.
снять диск с лев. надеть на средн.
снять диск с лев. надеть на прав.
снять диск с средн. надеть на прав.
снять диск с средн. надеть на лев.
снять диск с прав. надеть на лев.
снять диск с средн. надеть на прав.
снять диск с лев. надеть на средн.
снять диск с лев. надеть на прав.
снять диск с средн. надеть на прав.
Список используемой литературы:
1. Суркова Е. В. Лабораторный практикум по программированию на языке Pascal. Задания и примеры. 2007 год. 59 стр.
2. Д. Алкок. Паскаль в иллюстрациях. 1991 год. 192 стр.
3. М.А. Черкасов. Практический курс программирования на ПАСКАЛЕ. Уч. пособие. 2005 год.
4. Д. Прайс. Программирование на языке Паскаль. Практическое руководство. 1987 год. 234 стр.
5. Сайт Wikipedia
6. Сайт http://pas1.ru/
Размещено на Allbest.ru
...Подобные документы
История и суть задачи "Ханойские башни", построение ее математической модели в виде рекуррентного соотношения. Решение задачи с помощью рекурсии и кода Грея, ее связь с теорией графов. Анализ временных затрат. Различные головоломки с измененным условием.
курсовая работа [1021,6 K], добавлен 06.08.2013Организация вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. Способы программирования алгоритмов с использованием рекурсии. Преимущества и недостатки использования рекурсии.
лабораторная работа [27,8 K], добавлен 28.05.2012Использование рекурсии в предметных областях. Рекурсивные процедуры и функции в программировании. Создание алгоритмов для рисования графических изображений с использованием рекурсии в среде программирования Pascal ABC. Примеры рекурсии в графике.
творческая работа [6,7 M], добавлен 01.02.2014Представление задач в виде графов AND/OR, примеры. Задача с ханойской башней. Формулировка процесса игры в виде графа. Основные процедуры поиска по заданному критерию. Эвристические оценки и алгоритм поиска. Пример отношений с определением задачи.
лекция [154,6 K], добавлен 17.10.2013Ханойские башни: постановка задачи, условия перемещения дисков со стержня на стержень. Стратегия решения, используемые предикаты. Текст программы на языке Пролог. Построение модели решения задачи о ферзях. Примеры использования списков в языке Пролог.
презентация [72,0 K], добавлен 29.07.2012Разработка программной реализации для решения задач бесприоритетного и приоритетного распределений. Контрольный пример решения задачи бесприоритетного распределения со структурой иерархии 5-4-2. Алгоритм расчета задачи одноресурсного распределения.
курсовая работа [2,3 M], добавлен 05.01.2013Задачи, решаемые методом динамического программирования. Основные этапы нахождения деревянного алгоритма решения задачи. Выполнение алгоритма Прима. Построение Эйлерового цикла. Решение задач средствами Excel. Алгоритм основной программы - Derevo.
курсовая работа [586,3 K], добавлен 04.04.2015Описание решения задачи, ее постановка, общий подход к решению. Представление исходных данных, условий задачи и целей ее решения. Составление алгоритма решения поставленной задачи. Написание программного обеспечения и тестирование конечного продукта.
курсовая работа [1,1 M], добавлен 03.07.2011Определение функции, ее прототип. Рекурсия - частичное определение объекта через себя. Рекурсивная функция произведения 2-х целых чисел. Задача о вычислении Факториала. Вычисление чисел Фибоначчи. Рекурсивное исполнение программы о Ханойских башнях.
презентация [1,2 M], добавлен 20.05.2012Характеристика задачи АВ01, ее выходная и входная информация, выбор и обоснование состава технических средств и средств программной реализации. Разработка алгоритма и программы решения задачи АВ01, руководства пользователя и контрольный пример решения.
курсовая работа [2,1 M], добавлен 21.12.2011Исследование понятия рекурсии в программировании. Описание метода, который позволяет разбить задачу на части все меньшего и меньшего размера. Изучение схемы работы рекурсивной процедуры. Способы изображения древовидных структур. Избавление от рекурсии.
презентация [486,1 K], добавлен 22.10.2013Оптимизация решения задачи с помощью алгоритма отжига. Анализ теории оптимизации как целевой функции. Метод градиентного спуска. Переменные и описание алгоритма отжига. Представление задачи коммивояжера через граф. Сведение задачи к переменным и решение.
курсовая работа [784,0 K], добавлен 21.05.2015Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.
курсовая работа [2,5 M], добавлен 22.11.2012Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя.
курсовая работа [449,8 K], добавлен 14.01.2011Обзор методов и подходов решения поставленной задачи аппроксимации логического вывода экспертной системы. Разработка и описание метода сетевого оператора для решения данной задачи. Разработка алгоритма решения. Проведение вычислительного эксперимента.
дипломная работа [1,5 M], добавлен 23.02.2015Определение и описание "генетического алгоритма", идея которого состоит в организации эволюционного процесса, конечной целью которого является получение оптимального решения в сложной комбинаторной задаче. Пример его тривиальной реализации на C++.
контрольная работа [172,1 K], добавлен 24.05.2010Численные решения задач методом Коши, Эйлера, Эйлера (модифицированный метод), Рунге Кутта. Алгоритм, форма подпрограммы и листинг программы. Решение задачи в MathCad. Подпрограмма общего решения, поиск максимальных значений. Геометрический смысл задачи.
курсовая работа [691,4 K], добавлен 17.05.2011Составление программы для расчета начального базиса сбалансированной транспортной задачи, где суммарные запасы поставщиков равны суммарным запросам потребителей. Алгоритм метода потенциалов. Пример решения транспортной задачи методом наименьшей стоимости.
отчет по практике [991,3 K], добавлен 06.12.2013Теоретическая основа линейного программирования. Задачи линейного программирования, методы решения. Анализ оптимального решения. Решение одноиндексной задачи линейного программирования. Постановка задачи и ввод данных. Построение модели и этапы решения.
курсовая работа [132,0 K], добавлен 09.12.2008Исследование правил интеллектуальной игры "Ханойская башня". Описания алгоритма решения задачи на языке программирования Пролог. Характеристика компиляции и запуска программы с решением для трёх дисков. Изучение работы визуализатора, написание скрипта.
курсовая работа [672,6 K], добавлен 13.06.2012