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

5. Формы рекурсивных процедур6

Ij общем случае любам рекурсивная процедура Р включает в себя некоторое множество операторов Д и один или несколько операторов рекурсивного вызова Р. Структура рекурсивных процедур может принимать три ра;шых формы.

1. Форма с выполнением действий после рекурсивно­го вы:юва (или с выполнением действий на рекурсивном возврате). Не схема:

ал г р

иач

юли • yi МП тиг'-то

се

л

кон

ННЫИ р.1 1Д1'Л ПОЛГОПЩЛГП |Ч'Л;|К1)ИП1. ■ П|>1

23

или

алг Р нач

юли ■- /словие> то р

д

се кон

11римеры такой п[>оцелуры: алг ВыьолЧисл.а (арг цел п) нач

если п > 1 то

НыводЧисла(п — 1) ■се

шымоц п, " " кон

и

алг ВыводЧисла(«рг цел п)

нач

ели п > О то

ВыводЧисла(п — 1) ■ывод п, " " ■се кон

Нетрудно предсказать результат их выполнения, на­пример, при п = 5:1 2 3 4 5.

2. Форма с выполнением действий до рекурсивного вызова (или с выполнением действий на рекурсивном спуске). Ее схема: алг Р нач

МАТЕРИАЛЫ! fry УШК ч

j ВыводЧисла(n — 1) все кон

ЛИ

алг ВыводЧисла(арг цел п) нач

если п > О то

вывод п, " " ВыводЧисла{п - 1) все кон

Результат (при п — 5): 5 4 3 2 1.

3. Форма с выполнением действий как до, так и после рекурсивного вызова (или с выполнением действии как на рекурсивном спуске, так и на рекурсивном возврате). Ее схема: алг Р нач Д

если <условие> то р

все Д кон или

алг Р нач

если <уаловие> то

Д

Р

д

все кон

Примеры:

алг ВыводЧисла(арг цел п) нач

вывод п, " " если п > 1 то

ВыводЧисла(п — 1) все

вывод п, " " кон

или

алг ВыводЧисла(арг цел п) нач

если п > О то

вывод п, " " ВыводЧисла(п — 1) вывод п, " " все кон

Их результат: 543211234 5.

2008 № 5 ИНФОРМАТИКА

Задания для самостоятельной работы учащихся

Предсказать результат нмполиения следующих про­цедур при а * 4:

1)

алг ПКарг цел а)

нач

если а > 1

то

П1(а - 1)

все

вывод а * а, " " кон Ответ: \ 4 9 16.

2)

алг П2(арг цел а)

нач

если а > О то ~~П2(а - 1)

вывод -а, " " все кон

Ответ: при п = 5: -1 -2 -3 -4.

3)

алг П3(арг дел а)

нач

вывод 2 * а, " " если а > 1 то

П3(а - 1) все кон

Ответ: 8 6 4 2.

4)

алг П4 (арг дел а)

нач

если а > О то

вывод а * а * а, П4(а - 1) все кон

Ответ: 64 27 8 1.

5)

алг П5(арг дел а)

нач

вывод а * а

если а > 1 то П5(а - 1)

все

вывод а * а, кон Ответ: 16 9 4 1 1 4 9 16.

алг П6(арг дел а) нач

если а > 0 то

вывод а, " " П6(а - 1) вывод а, " " все кон

Ответ: 8642246 8.

2008 № 5 Информатика

25

б. Теоретические вопросы по теме

1. Что такое рекурсия?

2.. Какое определение понятия называется "рекур­сивным"? Приведите примеры.

3. Что такое базовая и рекурсивная часть рекурсив­ного определения понятия? Укажите эти части в приве­денных ранее примерах.

4. Какое значение имеет базовая часть рекурсивного описания?

Я Как:ш функция (процедура) называется "рекурсивной1?

Ь. Как должна быть оформлена рекурсивная функция (процедура), чтобы ее вызовы не продолжались "беско­нечно"?

7. Что происходит в оперативной памяти при рекур­сивном вызове функции (процедуры)?

5. Что такое "косвенная рекурсия"?

Ч Какая проблема возникает в программе на языке Паскаль при использовании косвенной рекурсии? Как она решается?

10. Какие возможны формы рекурсивных про­цедур? В чем особенность каждой из них? Приведите примеры.

Рекурсивные алгоритмы — послесловие

Знакомство учащихся с понятием "рекурсия" и примерами использования ее в программировании является, безусловно, полезным, особенно при изуче­нии информатики на профильном уровне. Рекурсия является удобным средством решения большого чис­ла задач. Одна из них — задача нахождения к-то члена последовательности Фибоначчи (см. раздел 3 в статье Н.А. Медведьковой). Вот как пришлось бы оформить соответствующую функцию (для универсальности приведем вариант на школьном алгоритмическом языке):

алг цел ОиС(арг цел к) нач цел очер, пред, предпред, i пред := 1 предпред := 1 нц для i от 2 до к - 2 очер := пред + предпред предпред := пред пред := очер

внач := очер I Значение функции кон

В ней использованы следующие величины:

очер ~ очередной рассчитываемый элемент после­довательности;

пред — элемент, предшествующий очередному эле­менту,

предпред — элемент, предшествующий элементу пред.

А теперь посмотрите, как просто и логично выгляди рекурсивный вариант функции: алг ц«л ФиС(арг ц«л к) нач

если к > 2 то

(Рекурсивный вызов функции Фиб анач := Фиб(к - 2) + ФиС(к - 1)

анач := 1 вса кон

Такое оформление полностью соответствует закону построения последовательности Фибоначчи — очеред­ной элемент последовательности равен сумме двух пре­дыдущих. При нем не требуется применять оператор цикла и думать над последовательностью расчета значе­ний пред и предпред.

Другие показательные примеры — задачи, связанные с прогрессиями (см. задачи 2-5 в статье НА. Медведь­ковой). При их решении с применением рекурсии мож­но не вспоминать нужные формулы (©).

Одним из самым ярких примеров использова­ния рекурсии является метод сортировки числовых массивов, разработанный в 1962 г. в Англии про­фессором Оксфордского университета Ч.Хоаром (С.Ноаге). Этот метод, считающийся самым быст­рым из всех известных, основан на рекурсии (см., например, книгу Д.М. Златопольского "Программиро­вание: типовые задачи, алгоритмы, методы". Mz БИНОМ. Лаборатория знаний, 2007).

В то же время следует обратить внимание на то, что применение рекурсивных процедур и функций в ряде случаев нерационально. Здесь, как ни стран­но, необходимо вспомнить все ту же задачу опре­деления к-то члена последовательности Фибоначчи. Приведенная выше рекурсивная функция работает весьма неэффективно. фмо(17) вычисляется в ней как Фмб(16) + Фи6(15). Фиб(16), в свою очередь, оп­ределяется как фмо(15) + Фмб(14). Таким образом, Фиб(15) будет вычисляться два раза, Фиб(14) — три, Фмб(13) — 5, Фиб(12) ~ 8 раз и т.д. Всего при вы­числении Фи6(17) понадобится более тысячи, при вычислении Фи()(31) — свыше миллиона, при вы­числении Фыо(45) — свыше .миллиарда операции сложения! (Кушниренко А.Т., Лебедев А.Г., Злпделъ-ман Я.И. Информатика 7-9: Учебник для общеоб­разовательных учебных заведении. М.: Дрофа, 2000). Для сравнения — при определении 45-го члена последовательности Фибоначчи по нерекурсивному варианту функции выполняется всего лишь 43 опе­рации сложения.

Итак, учащиеся должны знать, что рекурсия — это, как правило, всегда эффектно, но не всегда эффективна..

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]