Рис. 3.
На рис. 3 умовно подано:
1. звертання до процедури F1 із тіла програми Pr;
2. звертання до процедури F2 із тіла процедури F1;
3. звертання до процедури F2 всередині самої себе – рекурсія.
Приклад 4.1. Визначити факторіал у рекурсивній формі:
n!= 1, при n= 0;
n! = n(n-1)!, при n>0.
Тут n! визначається через (n!-1), тобто через ту ж саму функцію.
Program FACT (input, output);
var n : integer;
FUNCTION F ( v : integer): integer;
begin
if v = 0 then F := 1
else F := v * F(v-1);
end;
begin
writeln (‘ ввести аргумент n ‘);
read ( n );
if n<0 then writeln (‘факторіал не визначений’);
else writeln (‘факторіал’, n ,’= ’, F(n));
end.
В прикладі 5.1 рекурсивна функція F обчислює факторіал для n>0 за формулою n!=n(n-1)!. Однак, дану функцію можна представити і не рекурсивною:
FUNCTION F( v : integer): integer;
begin
F := 1:
for i := 1 to v do
F := F * i;
end;
Формально у мові Паскаль не дозволяється використовувати конструкції, які ще не описані.
Для виключення таких ситуацій використовують, так званий, випереджальний опис процедур і функцій. При цьому до опису процедури F1 вказується на подальші використання процедури F2. Тоді звертання з F1 до F2 допустимо.
Program Pr…;
Procedure F2 (параметри);
FORWARD;
Procedure F1 (параметри);
F2 (параметри);{звертання до F2 всередені F1}
end;
Procedure F2;{список параметрів відсутній}
end;
begin
end.
Pr містить дві незалежні процедури F1, F2. В F1 є звертання до F2, тому використаний впереджальний опис процедури F2, який складається із заголовка з параметрами і службового слова FORWARD. Тоді сам опис F2 має заголовок без повторення формальних параметрів.
!Особливості:!
1)при наявності у складі програми декількох процедур або функцій, які звертаються одна до одної, то виникає, так звана, непряма рекурсія. У цьому випадку використовують випереджальний опис процедур.
2)Вхід до блоку процедур або функцій тільки через його початок, а вихід по закінченню всіх дій. Таким чином оператори goto – заборонені, тобто всі мітки у блоці належать блоку і описуються у блоці. Поняття локальних і глобальних міток не існує.
3)При необхідності вийти із середини блока можна використавши стандартну процедуру EXIT , яка має форму:
EXIT (аргумент)
(аргумент – ім’я функції, процедури, програми,
службове слово PROGRAM)
Якщо аргументом є ім’я програми або службове слово PROGRAM, то виконання програми достроково завершується. Якщо аргументом є процедура або функція, то вони завершуються і управління передається в той блок, який викликав процедуру або функцію. Тобто оператору, який стоїть після оператору виклику (рис.4).
4)При використанні в процедурах і функціях глобальних змінних, можлива поява так званих побічних ефектів.
Суть: значення глобальних змінних, які отримані у зовнішньому блоці до входа до процедури (функції), можуть бути змінені в процесі виконання процедури (функції), що приведе до помилки при подальшому їх використанні в програмі.