Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Турбо Паскаль.doc
Скачиваний:
789
Добавлен:
10.04.2015
Размер:
1.84 Mб
Скачать

1. 12. 2. Рекурсивные функции и процедуры

Если одна процедура (Pr_2) вызывает в своем разделе выполнения другую (Pr_1), то вызываемая процедура должна быть описана во внешней программе перед описанием вызывающей процедуры, либо внутри вызывающей процедуры. Возможны и циклические случаи: если процедура вызывает сама себя -прямая рекурсия , если обе процедуры вызывают в своих разделах выполнения друг друга-косвенная рекурсия.

60

Схема линейного взаимодействия процедур:

Pr_1 -раздел описания Pr_1 Pr_2 -раздел описания Pr_2

Pr_2 -раздел описания Pr_2 Pr_1 -раздел описания Pr_1

Вызов Pr_1 в процедуре Pr_2 Вызов Pr_1 в процедуре Pr_2

Внешняя программа Внешняя программа

Схема циклического взаимодействия процедур:

прямая рекурсия косвенная рекурсия

раздел описания программы Pr_2 - заголовок Pr_2 Forward;

Pr_1-раздел описания Pr_1

Вызов Pr_2 в процедуре Pr_1

Pr_1 -раздел описания Pr_1

Pr_2 -раздел описания Pr_2

Вызов Pr_1 в процедуре Pr_1 Вызов Pr_1 в процедуре Pr_2

Внешняя программа Внешняя программа

Если процедура вызывает сама себя ( прямая рекурсия), то она описывается как обычно. Рекурсия традиционно применяется для итерационного расчета значения функции с использованием результатов предыдущего шага. Например, для расчета выражений вида:X!( X факториал ),XN( X в степени N ), вычисляемых по формулам:XN= XN-1 * k, где k-постоянная или переменная величина. В общем случае рекурсия применяется при расчете функции от функции:FN(x) = FN-1(x).При этом процесс происходит в два этапа: обратное движение с запоминанием цепочки расчета в оперативной памяти и прямое движение-расчет с использованием полученной цепочки. Рекурсивные процедуры требуют больше памяти для запоминания промежуточных результатов, чем обычные циклические операторы, поэтому рекурсии используются реже. В случае рекурсивных процедур следует обязательно предусмотреть условие окончания вызова процедуры.

Приведем пример традиционного использования рекурсии. Пусть требуется рассчитать число осколков, полученных в результате деления тела за "N" миллисекунд, если каждый осколок делится на два за одну миллисекунду. Тогда при N=0 число осколков = 1, при N>0 число осколков = 2N= 2*2(N-1).

Функция, возвращающая число осколков, будет иметь вид:

Function K_O(N: word): Longint;

begin

if N=0 then K_O:=1 {условие окончания рекурсии}

else K_O:=2*K_O(N-1) {рекурсивный вызов}

end;

61

Пример функции, возвращающей число осколков, без использования рекурсии:

Function K_O(N: word): Longint;