- •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 Информатика
2. Особенности выполнения рекурсивных алгоритмов
Учш!п'.и>: "Рассмотрим программу. » результате выполнения которой па экран выводится текст истории о попе и ею собаке ("У иона была собака...").
На доске записывается текст программы:
Program History; Procedure Print; Begin
Writel.il ('У попа Пыла еоолкл,'); Writ о In ('Он ее люйил.1);
1 Or
ат. nrursio — ио;шр;111ц.'нио. — Прим. \к\\.
2 Почему *это нлжно, п
Wri tel n ('Она съела кусок нтм ') ;
WriteIn ('Он ее убил.');
Writeln ('Убил и закопал');
Writeln {'И на могиле написал:');
Print; (Рекурсивный вызов процедуры Print!
Readkey {Ожидание нажатия люСюй клавиши) End; BEGIN {Основной программы}
Print END.
Учитель: "Сколько pa.i текст истории будет нынелеп на экран?".
В xcv\e обсуждения необходимо рассказать (напомнить), что при каждом ны;юиеиспомоп11\*льной процедуры (функции) для нее отводится место в оперативной памяти, которое "освобождается" после завершения ее (про-цедуры) работы. Но если но вепомогаа'лыюй процедуре имеется рекурсия, то вы.ювы вспомогательных прмодур будут продолжаться до тех пор, когда выделенное место в памяти будет исчерпано (и результате на экране появится сообщение об ошибке, связанной с этим фактом)'.
Чтобы устранить этот недостаток, необходимо так оформлять процедуры (функции), чтобы рекурсивные вызовы осуществлялись по условию, которое когда-то станет ложным.
Например, в рассмотренной программе должна быть описана процедура с параметром и использован условный оператор: Program History; Procedure Print(Var n: byte); Begin
If n > 0 Then Begin
n := n - 1
Writeln ('У попа была собака, ');
End End; BEGIN (Основной программы}
Print(20) END.
Для объектов с рекурсивным определением при ложном значении условия должна выполняться базовая часть определения (см. функцию Рдля нахождения факториала заданного числа п в разделе 1).
Последовательность рекурсивных вызовов функции F при п = 3 показана пи рис. 2.
Выполнение оператора х := F(3) в основной части программы требует первого обращения к функции Р. В оперативной памяти выделено место для размещения этой функции, а параметру п будет присвоено значение 3. Начнется выполнение функции. Так как п> 1, то будет выполнена ветвь условного оператора, содержащая рекурсию:
F :== 3 * F(2)
Оснопияп■ |
fir |
П. npiirpsl |
|
|
||
It |
S) |
|
|
|
|
|
I |
6 |
|
|
|
|
|
|
|
|
3 |
|
n |
Рис. г
В результате будет опять вызвана функция F и ей будет передано значение п = 2. При выполнении функции также "сработает" рекурсивная ветвь:
F := 2 * F(l)
что потребует очередного размещения в памяти функции ? с параметром п = 1. При ее выполнении рекурсивного вызова не будет (согласно базовой части f = 1). Найденное значение F(l) = 1 будет передано в функцию, откуда была вызвана функция* F с параметром п = 1, после чего место, выделенное под последнюю функцию, освободится1. В результате будет рассчитано значение F(2) = 2, которое также "вернется" в вызывающую функцию для определения значения F(3). Это значение F(3), равное 6, будет возвращено в основную часть программы и присвоено переменной х.
От редакции. Механизм организации работы рекурсивных процедур (функций) подробно описан в статье ЕА Е^-мчна Cwk , опубликованной в "Информатике" № 2-4/2008.