Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль / sidorov / Сидоров.DOC
Скачиваний:
30
Добавлен:
10.12.2013
Размер:
1.68 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;