Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 01. Рекурсия.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
330.12 Кб
Скачать

Рекурсія

1. Проста рекурсія

Рекурсією називається ситуація, коли підпрограма викликає сама себе.

Рекурсія зустрічається і тих випадках, коли основну задачу можна поділити на піл задачі, які мають ту ж саму структуру, що і початкова задача.

Підпрограми, в яких реалізована рекурсія називаються рекурсивними підпрограмами.

При створенні рекурсивних підпрограм необхідно приділяти особливу увагу на вихід з підпрограми у потрібний момент!

Іноді зустрічаються ситуації, коли деяка підпрограма звертається до іншої підпрограми, а та, в свою чергу, викликає першу підпрограму. Така рекурсія називається непряма (складна) рекурсія.

Звичайна (пряма) рекурсія буває двох видів: низхідна та висхідна.

Низхідна рекурсія послідовно розбиває задачу на більш прості, поки не дійде до кінцевої ситуації (матрьошка).

Наприклад, опишемо n!

n! = n* (n-1)!, якщо n=0, то n!= 1

Fact(3)= 3* Fact(2)= 3*2* Fact(1) = 3*2*1* Fact(0)= 3*2*1* 1=6

Program Factorial1;

Var N:integer;

Function Fact(i: integer) : longint;

begin

If i= 0 then Fact := 1

else Fact := i * Fact(i-1);

end;

Begin

Writeln (‘Введіть ціле число’);

Readln (N);

Writeln ( Fact(N) );

End.

У висхідній рекурсії проміжні результати вираховуються на кожній стадії рекурсії, отже відповідь будується поступово та передається у вигляді параметра до тих пір, поки не буде досягнута кінцева ситуація.

Наприклад, опишемо n!

Fact(3) = FactN(3,1) = FactN (2, 3*1) = FactN (1, 2*3*1) = FactN (0, 1*2*3*1) =

1*2*3*1 = 6

Program Factorial2;

Var n:integer;

Function FactN(i,m: integer) : longint;

begin

If i= 0 then FactN := m

else FactN:= FactN (i-1, i*m);

end;

Begin

Writeln (‘Введіть ціле число’);

Readln (N);

Writeln ( FactN (N,1) );

End.

Просту рекурсію часто порівнюють з античним змієм Уроборос, який пожирає свій хвіст.

Малюнок з алхімічного трактату «Synosius» Теодора Пелеканоса (1478г).

2. Складна рекурсія

Можлива трохи більш складна схема: функція A викликає функцію B, а та в свою чергу викликає A. Це називається складною рекурсією. При цьому виявляється, що перша описана процедура повинна викликати ще не описану. Щоб це було можливо, потрібно використовувати попередній опис.

Наприклад:

procedure A(n: integer); { Попередній опис першої процедури }

procedure B(n: integer); { Попередній опис другої процедури }

procedure A(n: integer); { Повний опис процедури A }

begin

writeln(n);

B(n-1);

end;

procedure B(n: integer); { Повний опис процедури B }

begin

writeln(n);

if n<10 then

A(n+2);

end;

Попередній опис процедури B дозволяє викликати її з процедури A.

Попередній опис процедури A в даному прикладі не потрібно і додано з естетичних міркувань.

У даному випадку більше підійде такий малюнок:

Складна рекурсія.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]