непряма рекурсія

Розглянуті вище програми використовували так звану пряму рекурсію, коли в тілі деякої процедури містився безпосередній виклик самої себе. У мові Паскаль допускається також і непряма рекурсія, коли, наприклад, процедура, процедура А викликає процедуру В, а та, в свою чергу, - процедуру А. Довжина таких ланцюжків викликів може бути довільною, проте при розробці програми необхідно ретельно стежити за тим, щоб рекурсивний алгоритм був збіжність, тобто не приводив до нескінченних взаємних викликам підпрограм.

Образно непряму рекурсію можна описати так. Перед дзеркалом 1 стоїть дзеркало 2, в якому відбивається саме дзеркало 1. В останньому видно дзеркало 2 і т.д.

Наведемо приклад програми, що ілюструє непрямі рекурсивні виклики процедур. У цій програмі процедури Rec1 і Rec2 рекурсивно викликають один одного, по черзі зменшуючи свої фактичні параметри. Легко бачити, що обидві процедури працюють з однією глобальною змінною А, яка передається в них по посиланню. Критерієм завершення роботи є звернення цієї змінної в нуль.

Зверніть увагу, що в програмі необхідно попереднє визначення другої процедури Rec2, так як її виклик зустрічається в процедурі Rec1, тобто перед її повним описом.

Program KosvRecurs;
Var
A. integer;
Procedure Rec2 (Var Y: integer); Forward;

Procedure Rec1 (Var X: integer);
Begin
X: = X-1;
if X> 0
then
Rec2;
writeln (X)
End;

Procedure Rec2 (Var Y: integer);
Begin
Y: = Y div 2;
if Y> 2
then
Rec1;
writeln (Y)
End;

Схожі статті