-
Рекурсия
Рекурсия – это
обращение подпрограммы к самой себе.
Чтобы такое обращение не было бесконечным,
в теле подпрограммы должно быть условие,
по достижении которого дальнейшего
обращения не происходит. Это требование
является главным требованием к рекурсивным
процедурам
Пример рекурсивного вычисления
факториала:
Математически функция вычисления
факториала определяется так:
0!=1
n!=n*(n-1)!
Program Recurce;
{Функция
для рекурсивного вычисления факториала}
Function
Factorial(N:Byte):Longint;
Begin
If
N=0 then Factorial:=1
Else Factorial:=N*Factorial(N-1);
End;
BEGIN
WriteLn(Factorial(6));
END.
Формы рекурсивных
подпрограмм:
-
С выполнением действий на рекурсивном
спуске (действия выполняются до
рекурсивного вызова)
Пример
Procedure Proc1;
Begin
действия;
If условие
then Proc1;
End;
-
С выполнением действий на рекурсивном
возврате (действия выполняются после
рекурсивного вызова)
Пример
Procedure Proc2;
Begin
If условие
then Proc2;
действия;
End;
-
С выполнением действий как на возврате,
так и на спуске.
Чаще всего рекурсивные подпрограммы
используются при обработке списковых
или древовидных структур данных
(Например, при разработке трансляторов
выполняется построение дерева разбора).
Встречается также косвенная
рекурсия. В этом случае первая
процедура вызывает вторую, а вторая –
первую. При использовании косвенной
рекурсии требуется опережающее
описание – к заголовку процедуры
добавляется зарезервированное слово
Forward.
Пример косвенной
рекурсии:
Procedure
Test2; Forward;
Procedure
Test1;
Begin
.
. .
Test2;
.
. .
End;
Procedure
Test2;
Begin
.
. .
Test1;
.
. .
End;