Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Рекурсия более высокого порядкаСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Используя более мощные виды рекурсии, можно записывать относительно лаконичными средствами и более сложные вычисления. Одновременно с этим, поскольку определения довольно абстрактны, растет сложность отладки и понимания программ. Если в определении функции рекурсивный вызов является аргументом вызова этой же самой функции, то в такой рекурсии можно выделить различные порядки (order) в соответствии с тем, на каком уровне рекурсии находится вызов. Такую форму рекурсии называют рекурсией более высокого порядка. Функции, которые мы до сих пор определяли, были функциями с рекурсией нулевого порядка. В качестве классического примера рекурсии первого порядка часто приводится функция Аккермана: А(m, n) = n+1 при m = 0; А(m, n) = А(m-1,1) при n = 0; А(m, n) = А(m-1, А(m, n-1)) в остальных случаях. Кажущаяся простота этой функции обманчива. Вызов функции завершается всегда, однако ее вычисление довольно сложно, число рекурсивных вызовов растет лавинообразно уже при малых значениях аргумента. В практике программирования рекурсий высокого порядка стараются избегать, разбивая определение на несколько частей и используя подходящие параметры для сохранения и передачи промежуточных результатов. Рекурсия и итерация Многие рекурсивные определения можно заменить нерекурсивными и организовать вычисления без использования рекурсии. В программировании есть два средства реализации повторяющихся вычислений/процессов: • с помощью итерации в форме цикла - последовательного повторения некоторого процесса до тех пор, пока не удовлетворится некоторое условие; • с помощью рекурсии - вложения одной операции в другую, когда при отрицательном результате проверки условия выполнение процесса «приостанавливается» и происходит самовключение выполняемого процесса сначала уже в качестве подпрограммы для еще не выполненной до конца первоначальной подпрограммы. Программы, использующие рекурсивные процедуры и функции, отличаются простотой, наглядностью и компактностью текста. Такие качества рекурсивных алгоритмов вытекают из того, что рекурсивная процедура/функция описывает, что нужно делать, а нерекурсивная акцентирует внимание на том, как нужно делать. Итерация требует меньше места в памяти и машинного времени, чем рекурсия, которой необходимы затраты на управление стеком. Однако существуют некоторые функции, которые легко можно определить рекурсивно, но которые нельзя определить в терминах обычных алгебраических выражений, например функция Аккермана. Для многих задач рекурсивная формулировка совершенно прозрачна, в то время как построение итерации оказывается весьма сложным делом. Пример 7.8 Задача о ханойских башнях. Даны 3 столбика - А, В, С. На столбике А один на другом находятся 4 диска разного диаметра, и каждый меньший диск находится на большем. Требуется переместить эти 4 диска на столбик С, сохранив их взаиморасположение. Столбик В разрешается использовать как вспомогательный. За один шаг допускается перемещать только один из верхних дисков какого-либо столбика, и больший диск не разрешается класть на диск меньшего диаметра. Для определения подхода к решению поставленной задачи рассмотрим более общий случай с и дисками. Если мы сформулируем решение для и дисков в терминах решения для n-1дисков, то поставленная проблема будет решена, поскольку задачу для n-1 дисков можно будет, в свою очередь, решить в терминах n-2 дисков и т. д. до тривиального случая одного диска. А для случая одного диска решение элементарно: нужно переместить единственный диск со столбика А на столбик С. Таким образом мы получим рекурсивное решение задачи. Рассмотрим словесное описание алгоритма. 1.Если n = 1, переместить единственный диск со столбика А на столбик С и остановиться. 2.Переместить верхние n-1 дисков со столбика А на столбик В, используя столбик С как вспомогательный. 3.Переместить оставшийся диск со столбика А на столбик С. Переместить n-1 дисков со столбика В на столбик С, используя столбик А как вспомогательный. Приведем программу Hanoi_Towers, которая решает поставленную задачу с помощью рекурсивной процедуры Move Disks. n - число дисков на столбике Source, Source - исходный столбик, Dest - столбик, на который нужно переставить диски, Тmр - вспомогательный столбик. {Ханойские башни} Program Hanoi_Towers; Var n: integer; Procedure Move_Disks (n: byte; Source, Dest, Tmp: char); Begin {Move_Disks} if n = 1 then
|
||||
Последнее изменение этой страницы: 2017-02-17; просмотров: 418; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.239.65 (0.01 с.) |