Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Паскалю.doc
Скачиваний:
61
Добавлен:
04.06.2015
Размер:
7.62 Mб
Скачать

Var temp : Integer;

Begin

If (k=n)

Then Max_element := a[n]

Else

Begin

temp := Max_element(a, k+1, n);

If (a[k] > temp)

Then Max_element := a[k]

Else Max_element := temp

End;

End;

Особенности рекурсии:

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

  • недостатки рекурсии состоят в следующем:

1. если глубина рекурсии велика, то программа будет требовать во время исполнения много памяти, что может привести к переполнению стека,

  1. рекурсивные алгоритмы, как правило, выполняются более медленно,

  • при рекурсивном программировании велика вероятность ошибок, вынуждающих программиста к перезагрузке компьютера.

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

В целях повышения безопасности работы рекомендуется:

  • для включения проверки переполнения стека необходимо использовать директиву компилятора {S+},

  • для включения проверки диапазона необходимо использовать директиву компилятора {R+},

  • в начале каждой рекурсивной процедуры или функции поместить строку If KeyPressed Then Halt. Она позволяет при зависании программы выйти из нее без перезагрузки компьютера, просто нажав любую клавишу.

Процедуры

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

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

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

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

Procedure Proc(n,m: Integer; a: Real; Var k: Integer; Var s, d: Real);

Описан заголовок процедуры Proc,зависящей от двух аргументов (входныхпараметров) целого типаn, mи аргументаaвещественного типа.Выходные(вычисляемые) параметры: переменнаяkцелого типа и переменные sиd вещественного типа.

Допускаются процедуры без списка формальных параметров:

Procedure Zagolovok;

Begin

WriteLn(‘Группа ИС-09’);

WriteLn(‘Студент Иванов Иван’);

End;

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

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

  • описания меток Label

  • определения констант Const

  • определения типов Type

  • описания переменных Var

  • описания процедур и функций Function, Procedure

  • операторов процедуры Begin … End;

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

Пример: описать процедуру, обменивающую значениями две переменных целого типа:

Procedure Swap(x, y: Integer);x и y – входные параметры-значения

Var temp: Integer; temp – локальная переменная

Begin

temp := x; реализация алгоритма

x := y; циклического обмена

y := temp;

End;

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

Procedure Swap(Var x, y: Integer); x и yвходные параметры-

Var temp: Integer; переменные

Begin

temp := x;

x := y;

y := temp;

End;

Обращение к процедуре в вызывающей программе производится по ее имени, за которым в скобках перечисляются фактические параметры, соответствующие формальным параметрам процедуры по количеству, типам и порядку следования:

Program Primer;

Uses CRT;

Var a, b: Integer; a и b – переменные основной программы (глобальные)

Procedure Swap(Var x, y: Integer); x и yвходные параметры-

Var temp: Integer; переменные

Begin

temp := x;

x := y;

y := temp;

End;

Begin

ClrScr;

a := 3;

b := 5;

Swap(a, b); обращение к процедуре

WriteLn(‘a=’,a);

WriteLn(‘b=’,b);

ReadLn;

End.

На экран будет выведено:

a=5

b=3

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

Как уже отмечалось в правилах формирования подпрограмм-функций, для передачи в подпрограмму массива необходимо предварительно определить его в разделе описания типов, то есть явно задать количество его элементов и их тип. Значит, подпрограмма, формальным параметром которой является массив из десяти чисел, не сможет работать с массивом из пятнадцати чисел. Это неудобно, поэтому в списке формальных параметров подпрограмм разрешается определять открытые массивы.

Открытые массивы– это вектора, состоящие из элементов любого типа, кроме файлового. На место открытого массива в качестве фактического параметра можно передавать векторлюбогоразмера, состоящий из элементов того же типа, что и элементы открытого массива:

Procedure Summ(a: Array Of Integer; Var summa: Integer);