Вызов 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;
Пример функции, возвращающей число осколков, без использования рекурсии:
Function K_O(N: word): Longint;
var N_1: Longint; i: word;
Begin
N_1:=1; for i:=1 to N do N_1:= 2*N_1; K_0:= N_1
end;
Если к каждому осколку добавляется два осколка, то число осколков = (1+2)N= 3*3(N-1).
Во внешней программе число осколков (переменная "NN") расчитывается вызовом функции:
NN:= K_O(t); где t - значение фактического параметра времени.