Рекурсия - это способ организации вычислительного процесса, при котором процедура или функция в процессе выполнения входящих в ее состав операторов обращается сама к себе непосредственно, либо через другие процедуры и функции.
Рекурсия может быть прямой или косвенной. При прямой рекурсии оператор вызова подпрограммы содержится непосредственно в ее исполняемой части. Любую рекурсивную процедуру (функцию) можно сделать не рекурсивной. Рекурсивное описание обычно короче и нагляд-нее, но требует больших затрат машинного времени (за счет повторных обращений) и памяти машины (за счет дублирования переменных) . Рекурсивная подпрограмма однократно вызывается извне. Условие полного окончания работы рекурсивной процедуры или функции должно находиться в ней самой.
Рассмотрим пример. Вычислить значение F=M! Рекурсивное определение значение факториала можно записать следующим образом:
при М=1 F=1 при М> 1 F= M!= M*(M-1)!, т.е. М! определяется через (М-1)!
a) Рекурсивная функция
PROGRAM MAIN; VAR M: INTEGER;
F:REAL;
FUNCTION FACT (N:INTEGER): REAL; BEGIN
IF N=1 THEN
FACT:=1
ELSE
FACT:= N* FACT(N-1);
END; BEGIN
READLN(M); F:= FACT ( M ); WRITELN (' M!=', F);
END.
b) Рекурсивная процедура
PROGRAM MAIN; VAR M: INTEGER;
F:REAL;
PROCEDURE FACT(N:INTEGER; VAR F: REAL); VAR Q : REAL; BEGIN
IF N=1 THEN Q:=1
ELSE FACT(N-1,Q);
F:=N*Q;
END; BEGIN
READLN(M); FACT ( M, F ); WRITELN (' M!=', F);
END.
B варианте а) при м=4 выполняются следующие действия:
При входе в функцию в первый раз отводится память под локальную переменную, соответствующую параметру-значению; ей присваивается значение фактического параметра (М). При каждом новом обращении строятся новые локальные переменные. Так как FACT(1)=1, то выполнение функции заканчивается. После этого выполняются действия:
FACT(1):=1; FACT:=2*FACT(1); FACT(2):=2; FACT:=3*FACT(2); FACT(3):=3*2=6; FACT:=4*FACT(3); т.е. FACT=24