Непряма рекурсія.
Крім поняття рекурсії, коли функція викликає саму себе, існує також непряма рекурсія. В такому випадку перша функція викликає іншу, яка в свою чергу викликає першу.
Розглянемо наступний приклад:
Обчислити
Складемо програму. За правилами Pascal при описі обєкта, наприклад функціїAlfa можна посилатися тільки на обєкт, який описано раніше. Це означає, що попередньо треба описати функціюBeta.Але вона в свою чергу посилається на функціюAlfa.Щоб вийти з замкнутого кола, перед функцієюAlfaописують так званий прообраз функціїBeta.Це заголовок функції з переліком всіх формальних параметрів. А щоб компілятор далі не вів пошук продовження функції, записуємо йому вказівку –директивуforward. А після опису функціїAlfaописуємо саму функціюBeta. При цьому список параметрив уже не вказують. Поняття прообразу функції (заголавків) використовують також у мові С.
Отже, отримуємо:
Var X:real;
function beta(x:real):real; forward;
function alfa(x:real):real;
begin
alfa:=beta(x)*sin(x);
end;
function beta;
begin
If abs(x)>0.01 then beta:=alfa(x/10)
else beta:=pi;
end;
begin
wite (‘введіть х=’); read(x);
writeln;
writeln(‘alfa=’,alfa(x)));
end.
Функції alfaтаbeta, викликаючи одна одну, зменшує значення змінної х до величини, меншої за 0.01, за якою припиняється дія рекурсивного виклику. За оберненої ходою отримуємо потрібнийрезультат.
Нехай x=5.
(5) = (5)*sin5;
В свою чергу (5)=(5/10)=(0.5);
Далі (0.5)=(0.5)*sin0.5;
В свою чергу (0.5)=(0.5/10)=(0.05);
І в кінці (0.05)=;
Оберненою ходою маємо:
3.14*sin0.5*sin5=-1.444
Контрольні запитання.
Що таке рекурсія?
Що таке глибина рекурсії?
Яким чином описується рекурсивна підпрограма? Привести приклади.
Що таке подвійна рекурсія:
Що таке непряма рекурсія?
Який вміст вкладається в поняття модульного підходу до програмування?
Що мається на увазі під словами “ефект хвилі”?
Що таке функціональна складність?
abc
3
1 4 2
abc
7
5 6
рис. 3.1. Алгоритм гри Ханойські вежі для n=3.
рис. 3.2. Приклад виконання функції Акермана.