- •2008 № I информатика
- •2008 № 4 Информатика
- •2. Статья "Частотный анализ"
- •1. Общие вопросы
- •2. Особенности выполнения рекурсивных алгоритмов
- •3. Рекурсивные функции и процедуры для обсуждения
- •2008 Nt 5 информатика
- •4. Задания на использование рекурсии
- •2008 № 5 Информатика
- •2008 N» 5 информатика
- •2008 N» 5 информатика
- •2008 № 5 Информатика
- •5. Прямая и косвенная рекурсия
- •5. Формы рекурсивных процедур6
- •2008 № 5 Информатика
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 операции сложения.
Итак, учащиеся должны знать, что рекурсия — это, как правило, всегда эффектно, но не всегда эффективна..