Рекурсивные процедуры и функции - Структурирование программы

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

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

В языке программирования Pascal имена процедур и функций можно использовать в качестве фактических параметров. С этой целью вводятся процедурные типы, которые позволяют указать, какой вид подпрограмм можно использовать в качестве параметра и с какими формальными параметрами должны быть эти подпрограммы.

Описание процедурного типа:

Type

Имя типа - procedure(список формальных параметров); имя типа - function(список формальных параметров):тип функции; var имя переменной: имя типа;

Примеры:

Type рrоg - procedure(var х, у: integer);

{процедура с двумя параметрами-переменными целого типа} fane = function(x:real):real;

{функция вещественного типа с одним параметром-значением}

Var р:рrоg; f:func;

Переменным процедурных типов можно присваивать в качестве значений имена соответствующих подпрограмм.

Имя переменной: = имя подпрограммы;

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

После такого присваивания имя переменной становится синонимом имени подпрограммы. Переменная процедурного типа используется при вызове подпрограммы: вместо имени подпрограммы указывается имя процедурной переменной: имя переменной (список фактических параметров).

Передаваемые подпрограммы не должны объявляться внутри других процедур и функций.

Пример:

Type

Рrоg = procedure(var x, y:integer); func = function(a:real):real; var p:prog; f:func;

X, y:integer; procedure swap(var x, y:integer); var z:integer; begin

Z:=x; x:=y; y:=z;

End;

Function tan (a:real):real; begin

Tan := sin(a)/ cos(a);

End;

Begin

Readln(x, y);

P:=swap;

F:=tan;

P(x, y);

Writeln(x, y);

Writeln(f(pi/4));

Readln;

End.

Процедурные переменные позволяют использовать одну и ту же подпрограмму для различной обработки данных.

Похожие статьи




Рекурсивные процедуры и функции - Структурирование программы

Предыдущая | Следующая