Функции пользователя (описание, вызов, структура). Рекурсивные подпрограммы

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

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

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

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

Описание и вызов функций 

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур. 
Формат описания функции:
Function имя функции (формальные параметры): тип результата;
раздел описаний функции
Begin
  исполняемая часть функции
End;
Формальные параметры в заголовке функций записываются в виде:
Var имя праметра: имя типа
отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа.

При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

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

Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:
имя функции := результат;
При вызове функций необходимо соблюдать следующие правила:
  • количество фактических параметров должно совпадать с количеством формальных; 
  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Заметим, что имена формальных и фактических параметров могут совпадать.
Пример: программа поиска максимума из двух целых чисел.
Var x,y,m,n: integer;
Function MaxNumber(a,b: integer): integer;

Var max: integer;
Begin
  If a>b Then max := a
  Else max := b;
  MaxNumber := max;
End;
Begin
  write('Введите x,y ');
  readln(x,y);
  m := MaxNumber(x,y);
  n := MaxNumber(2,x+y);
  writeln('m=',m,'n=',n);
End.
Рекурсия – способ организации вычислит. процесса, при котором процедура или функция в ходе выполнения ее операторов, обращается сама к себе.

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

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