
- •Рекурсія
- •1. Проста рекурсія
- •Var n:integer;
- •2. Складна рекурсія
- •3. Як працює рекурсія
- •4. Імітація циклу за допомогою рекурсії
- •5.Приклади використання рекурсивних алгоритмів
- •5.1 Переведення числа в двійкову систему.
- •5.2. Рекурентні співвідношення: основні поняття
- •5.3 Дерева
- •5.4. Швидкі сортування
- •6.7. Фрактали
Рекурсія
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 в даному прикладі не потрібно і додано з естетичних міркувань.
У даному випадку більше підійде такий малюнок:
Складна
рекурсія.