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

31.Способы передачи параметров в подпрограммы.

Механизм передачи параметров в процедуры:

  1. В момент вызова процедуры выделяется память под переменные процедуры.

  2. Формальные параметры получают значения фактических.

  3. Связь между параметрами и значениями разрывается.

  4. Процедура завершила работу – память освобождается.

Передача параметров различных видов

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

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

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

  4. Бестиповые параметры передаются по адресу. Перед использованием бестиповых параметров требуется выполнить приведение формального бестипового параметра к какому-либо типу.

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

32.Рекурсивное описание процедур и функций.

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

Рекурсия в программировании – один из важнейших принципов посторения подпрограмм, когда процедуры и функции могут вызывать сами себя.

Наличие условия в теле рекурсивной функции (или процедуры), при котором она больше себя не будет вызывать, очень важно. В противном случае, как и в ситуации с циклами, может произойти так называемое зацикливание.

Существует два вида рекурсий:

  1. Прямая рекурсия – подпрограмма вызывает саму себя.

Вычисление факториала:

function f(n: integer):longint;

begin

if n = 0 then f := 1

else

f := n*f(n-1);

end;

Рекурсивные вызовы:

f(5) = 5 * f(4) = 5 * 4 * f(3) = 5 * 4 * 3 * f(2) = 5 * 4 * 3 * 2 * f(1) = 5 * 4 * 3 * 2 * 1 * f(0) = 5 * 4 * 3 * 2 * 1 * 1 = 120

Возведение в степень рекурсивно:

function power (x:real; n:integer):real; begin if n=0 then power:=1 else if n mod 2=0 then power:=power (x*x,n div 2) else power:=x*power (x*x, n div 2);

end; var y:real; begin y:=power (2,5); writeln (y:2:2); readln; end.

Рекурсивные вызовы :

Power (2,5)=2*power (4,2)=2*power (16,1)=2*16*power (256,0)=2*16*1=32

  1. Косвенная рекурсия – опережающее описание (a вызывает b, b вызывает a).

Приведем пример программы, иллюстрирующей косвенные рекурсивные вызовы процедур. В этой программе процедуры Rec1 и Rec2 рекурсивно вызывают друг друга, поочередно уменьшая свои фактические параметры. Легко видеть, что обе процедуры работают с одной глобальной переменной А, которая передается в них по ссылке. Критерием завершения работы является обращение этой переменной в ноль.

Обратите внимание, что в программе необходимо предварительное определение второй процедуры Rec2, так как ее вызов встречается в процедуре Rec1, т.е. перед ее полным описанием.

Program KosvRecurs; Var   A : integer; Procedure Rec2 (Var Y:integer); Forward; Procedure Rec1 (Var X:integer); Begin   X := X-1;     if X>0       then         Rec2;         writeln (X) End; Procedure Rec2 (Var Y:integer); Begin   Y := Y div 2;     if Y>2       then         Rec1;         writeln (Y) End; Begin   A := 15;   Rec1(A); End.

Косвенная рекурсия используется при описании типа указатель на запись (в которой находится поле - указатель на такую же запись).

type ptr=^rec;

rec=record

str:string;

p:ptr;

end;