Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вспомогательные алгоритмы.doc
Скачиваний:
79
Добавлен:
13.04.2015
Размер:
219 Кб
Скачать
☆

Косвенная рекурсия.

Рекурсия называется прямой, если подпрограмма вызывает саму себя и косвенной, если две или более процедуры и функции вызывают друг друга взаимно.

1) 2)

Пример: Две процедуры вызывают друг друга взаимно.

Program primer;

………………….

procedure А1(k:integer);

begin

………………….

A2(k);

………………….

end;

procedure А2(i:integer);

begin

…………………...

A1(i);

end;

begin

………. {раздел операторов}

end.

В Pascal должно выполняться правило, чтобы имя до его использования было описано, поэтому обращение к процедуре А2 в теле процедуры А1 будет ошибочным. Чтобы этого избежать используется опережающее описание подпрограммы, в котором записывается только заголовок подпрограммы с директивой Forward. Затем ниже эта подпрограмма должна быть описана полностью, причем в заголовке достаточно записать только имя подпрограммы без формальных параметров

Program n;

………………….

procedure A2(i:integer);

Forward;

procedure A1(k:integer);

begin

…………………

А2(k);

…………………

end;

procedure A2; {без формальных параметров}

begin

…………………

A1(i);

…………………

end;

begin

…………………

end.

Процедурные типы.

В списке формальных параметров процедуры или функции могут быть параметры, означающие вызов той или иной подпрограммы, т.е. одна и та же процедура (или функция) может обращаться к различным процедурам или функциям при каждом новом обращении к ней. В ТP и ОP для реализации этой возможности предусмотрен специальный процедурный тип. Он позволяет указать, какой вид подпрограмм можно использовать в качестве параметра и с какими формальными параметрами должны быть эти подпрограммы. Процедурный тип описывается в разделе Type следующим образом:

Type

<имя типа>= Procedure(<список формальных параметров>);

<имя типа>= Function(<список формальных параметров>):<тип функции>;

Затем в списке формальных параметров основной процедуры <имя типа> используется при описании параметра:

<имя переменной>:<имя типа>;

Пример: Составить программу вывода на печать результата сложения и умножения двух целых чисел в заданном диапазоне. Для этого составить процедуру, которая печатает или таблицу сложения, или таблицу умножения.

Здесь будет применен параметр – функция, как параметр процедурного типа. Этот параметр будет являться параметром-значением процедуры. В качестве фактического параметра для него будет использована та или другая функция с параметрами требуемого типа.

Program Tablica;

type func=function(x, y:integer):integer; {описание процедурного типа}

function Add(x, y:integer):integer; far; {описание функции сложения}

begin

Add:=x+y;

end;

function Multiply(x, y:integer):integer; far; {описание функции умножения}

begin

Multiply:=x*y;

end;

procedure PrintTable(a, b:integer;operation:func); {процедура печати}

var i, j:integer;

begin

for i:=1 to a do

begin

for j:=1 to b do write(operation(i,j):5); {5-формат печати}

readln;

end;

writeln;

end;

begin {исполняемая часть программы}

PrintTable(10,10,Add);

PrintTable(10,10, Multiply);

end.

Чтобы правильно описать заголовок процедуры PrintTable необходимо предварительно описать имя процедурного типа, который затем используется для описания формального параметра operation. При обращении к процедуре PrintTable формальный параметр operation процедурного типа func заменяется фактическими параметрами – функциями Add и Multiply.

Отметим, что если подпрограмма используется для переменных процедурного типа, то в Turbo Pascal она независимо от своего положения должна компилироваться нестандартным образом. В этом случае в ней можно использовать директиву far или же ключ компилятора {$F+}.

В ОР это не обязательно.

20