- •Вспомогательные алгоритмы. Процедуры и функции.
- •Алгоритмы-процедуры и алгоритмы-функции.
- •Алгоритм-процедура
- •Алгоритм-функция.
- •Программирование с использованием процедур и функций. Описание подпрограммы-процедуры.
- •Описание подпрограммы функции.
- •Обращение к подпрограмме-процедуре
- •Обращение к подпрограмме – функции.
- •Особенность Оbject Pascal.
- •Использование массивов в процедурах.
- •Локальные и глобальные параметры (переменные).
- •Рекурсивные подпрограммы.
- •Косвенная рекурсия.
- •Процедурные типы.
Локальные и глобальные параметры (переменные).
Имена, описанные в теле процедуры (это i, j –в процедуре Vvod; i, j, c, k –в процедуре Select)-называются локальными параметрами, областью их действия является только тело процедуры, в которой они описаны. Если одно и то же имя (например, i, j) описано и в основной программе, и в теле процедуры, то эти имена воспринимаются компилятором, как совершенно различные, т.к. имя, описанное в основной программе отменяется для процедуры, где оно повторно описано. Хотя в основной программе (блоке обработки) вызов процедуры происходит в теле цикла по i и j, а процедура Select сама содержит циклы по i и j, однако никакой ошибки не возникает, т.к. эти переменные хранятся в различных местах памяти.
Если имя описано в основной программе, а в процедуре используется без описания, то такой параметр называется глобальным (такими являются n, m в процедуре Vvod и параметр n в процедуре Select). Областью действия таких параметров является как программа, так и тело процедуры.
Таким образом, обмен информацией между основной программой и подпрограммами может осуществляться не только с помощью формальных и фактических параметров, но и с помощью глобальных параметров. За счет использования глобальных параметров можно писать процедуры и функции совсем без параметров в заголовке.
Рекурсивные подпрограммы.
Рекурсией называется ситуация, когда подпрограмма вызывает саму себя. В математике давно используется рекурсивное определение. Рекурсия в математике – это описание объекта, содержащее ссылку на сам описываемый объект. Рекурсия позволяет сокращать описание объекта.
Определение факториала:
1)без рекурсии:
n!=
1*2*..*n, если n>0
2)c рекурсией:
n!=
(n-1)!*n, n>0
C видом определения величины связан алгоритм ее вычисления, поэтому основываясь на рекурсивном определении n! можно записать соответствующий рекурсивный алгоритм.
Язык Pascal является одним из алгоритмических языков, в котором допустимо рекурсивное описание подпрограмм. Рекурсия в подпрограмме – это обращение к самой себе в теле подпрограммы. Например, для подпрограммы-функции можно сказать, что функция вызывает себя рекурсивно, если имя функции внутри ее описания используется в правой части оператора присваивания.
Покажем это на примере подпрограммы функции вычисления n! в одном случае с рекурсией, в другом-без нее.
№1 без рекурсии
Запишем подпрограмму-функцию Fact1 с использованием локальной переменной fact.
Function Fact1(n:integer):longint;
var fact:longint;
i:integer;
begin
fact:=n;
for i:=n-1 downto 2 do
fact:=fact*i;
Fact1:= fact;
end;
№2 с рекурсией
Function Fact2(n:integer):longint;
begin
if n=0 then Fact2:=1
else Fact2:=Fact2(n-1)*n;
end;
Если в основной программе обратиться к функции Fact2, например:
Begin
……………..
a:=Fact2(4);
……………..
Еnd.
то будут выполнены действия:
a:=Fact2(3)*4;
a:=Fact2(2)*3*4;
a:=Fact2(1)*2*3*4;
a:=Fact2(0)*1*2*3*4;
a:=1*1*2*3*4=24
Рекурсивный процесс закончен.
Здесь при каждом новом обращении к подпрограмме функции Fact2 фактические параметры, которые она использует, записываются в стек (Stack).
Структура типаLIFO
Параметры помещаются один за другим в стек и забираются в обратной последовательности. Рекурсия – это один из методов, который применяют, если необходимо выполнить повторные действия, таким образом, как видно из примеров, в этом случае можно действовать двумя способами:
с помощью цикла (пример Function Fact1).
с помощью рекурсии, т.е. вложения одной операции в другую (пример Function Fact2)
Примеры 1 и 2 демонстрируют, прежде всего, различие между циклом и рекурсией. Fact1 использует вспомогательную локальную переменную fact. Рекурсивная функция Fact2 обходится без вспомогательных переменных. Однако выполнение рекурсивных подпрограмм приводит к многократным обращениям к ним самим. Это увеличивает время выполнения. Кроме того, есть опасность переполнения стека, в котором записываются адреса возвратов из подпрограммы, а также размещаются значения фактических параметров. Поэтому использование рекурсивных подпрограмм с одной стороны сокращает запись программы, делая ее более понятной, а с другой стороны увеличивает затраты памяти и машинного времени.