Рекурсивные подпрограммы

В ряде случаев требуется, чтобы подпрограмма вызывала сама себя. Такой способ вызова называется рекурсией. Рекурсия полезна в тех случаях, когда основную задачу можно разделить на подзадачи, каждая из которых реализуется по алгоритму, совпадающему с основным.

Пример . Вычисление факториала .

function Fact(n: integer): integer;

begin

if n<=0 then Fact:=1 else Fact:=n*Fact(n-1);

end ;
Параметры и аргументы

Параметры являются элементами подпрограммы и используются при описании ее алгоритма. Аргументы указываются при вызове подпрограммы и замещают параметры при выполнении подпрограммы. Параметры могут быть любого типа, включая структурированный. Существуют следующие виды параметров:

o значение;

o константа;

o переменная;

o нетипизированная константа и переменная.

Группа параметров, перед которыми в заголовке подпрограммы отсутствуют слова varили constи за которыми следует указание их типа, называются параметрами-значе-ниями. Например, aи bявляются параметрами-значениями в следующем описании: Procedure P1 ( a : real ; b : integer );

Параметр-значение обрабатывается как локальная по отношению к под­программе переменная. В подпрограмме значения таких параметров можно изменять, однако эти изменения не влияют на значения соответствующих им аргументов, которые при выполнении подпрограммы были подставлены вместо фактических параметров-значений.

Группа параметров, перед которыми в заголовке подпрограммы стоит слове constи за которыми следует описание их типа, называютсяпараметрами-константами. Например, в описании procedure P2 (const x, y: integer;); x и y являются параметрами-константами. В теле подпрограммы значение параметра-константы изменить нельзя. Те параметры, изменение которых в подпрограмме нежелательно и должно быть запрещено, можно оформить как параметры-константы. Кроме того, для параметров-констант строковых и структурных типов компилятор создает более эффективный код.

Группа параметров, перед которыми в заголовке подпрограммы стоит слово varи за которыми следует описание их типа, называютсяпараметрами-переменными. Например, параметрами-переменными являются dи f в сле­дующем описании: function F1(var d, f: real; q: integer ) : real ;

Параметр-переменная используется в случаях, когда значение должно быть передано из подпрограммы в вызывающий блок. В этом случае при вызове подпрограммы параметр-переменная замещается аргументом, и любые из­менения формального параметра отражаются на аргументе. Таким способом можно вернуть результаты из подпрограммы по окончанию ее работы.

Для параметров-констант и параметров-переменных можно не указывать их тип, в этом случае они считаются нетипизированными. Подставляемые на их место аргументы могут быть любого типа, и программист должен самостоя­тельно интерпретировать типы параметров в теле подпрограммы. Примером задания нетипизированных параметров-констант и параметров-переменных является следующее описание: function F2(var e1; const t2): integer ;

Отметим, что группы параметров в описании подпрограммы разделяются точкой с запятой.