Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
8
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные

Процедурной переменной можно присвоить:

  1. процедуру или функцию, например, f1:=FMin; причем FMin должна быть описана; В результате присваивания процедурная переменная будет содержать ссылку на функцию FMin.

  2. значение другой процедурной переменной, например, f2:= f1;

Для присваивания должна выполняться совместимость по присваиванию:

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

Присваивание f1:=FMin(1,2) будет недопустимым из-за несовместимости типов: слева ‑ процедурный тип, справа – тип integer результата функции.

function FMin(a,b: integer): integer;

begin if a<b

then Result:= a

else Result:= b

end;

function FMax(a,b: integer): integer;

begin if a>b

then Result:= a

else Result:= b

end;

var x,y:integer;

begin

f1:=FMin; //Присваивание процедурной переменной ссылки на функцию FMin

x:=f1(1,2); //Вызов функции Fmin через переменную f1, x получит значение 1

f2:=FMax; //Присваивание процедурной переменной ссылки на функцию FMax

y:=f2(1,2); //Вызов функции Fmax через переменную f2 y получит значение 2

writeln(x,’ ’, y)

end.

Вызовы f1(1,2) и FMin(1,2) – это одно и то же.

18.4.Процедурные переменные в качестве параметров

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

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

Это обратный вызов (callback).

function MinMax(i,j:integer; f: TFunc): integer; //f ‑ параметр процедурного типа

begin

Result:= f(i,j); //Обратный вызов

end;

begin

… res:=MinMax(x,y,FMin);//Прямой вызов функции MinMax . Фактический параметр – имя функции FMin

… end.

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

19.Рекурсия

19.1.Что такое рекурсия

«Рекурсия – мощный метод программирования, который позволяет разбить задачу на части все меньшего и меньшего размера до тех пор, пока они не станут настолько малы, что решение этих подзадач сведется к набору простых операций» (Род Стивенс)

Рассмотрим задачу вычисления факториала n!, означающего число различных перестановок последовательности из n элементов. Факториал определяется через произведение n!=12...n. Оно конечно и вычисляется с помощью цикла F:=1; for i:=1 to n do F:=F*i.

Рассмотрим рекуррентные формулы:

{1} 0!=1;

{2} n!=n(n-1)!, для любого n>0.

Определение {2} сводит задачу вычисления n! к вычислению (n-1)! и т.д. до тех пор, пока задача не сведется к вычислению 0!, решение которой следует из определения {1}. Например:

3!=32!, 2!=21!, 1!=10!, 0!=1. Тогда, двигаясь в обратном порядке, получим: 1!=11=1, 2!=21!=21=2, 3!=32!=32=6

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

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