double arrow

Вызов 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 - значение фактического параметра времени.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: