Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тема 6(теорія).doc
Скачиваний:
3
Добавлен:
13.07.2019
Размер:
324.1 Кб
Скачать

Форми рекурсивних підпрограм

У загальному випадку будь-яка рекурсивна підпрограма P містить деякий набір операторів S і один або кілька операторів рекурсивного виклику.

Головна вимога до рекурсивних підпрограм полягає в тому, що виклик рекурсивної підпрограми має відбуватися за виконанням певної умови.

Структура рекурсивної підпрограми може набувати трьох різних форм (на прикладі процедури):

Форма з виконанням дій до рекурсивного виклику

(з виконанням дій при рекурсивному спуску).

procedure P;

begin

S;

if умова then P;

end;

Форма з виконанням дій після рекурсивного виклику

(з виконанням дій при рекурсивному поверненні).

procedure P;

begin

if умова then P;

S;

end;

Форма з виконанням дій як до, так і після рекурсивного виклику

(з виконанням дій як при рекурсивному спуску так і при рекурсивному поверненні)

procedure P;

begin

S;

if умова then P;

S;

end;

або

procedure P;

begin if умова then

begin S;

P;

S;

end;

end;

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

Виконання дій при рекурсивному спуску

Для реалізації універсального алгоритму обчислення факторіалу, який виконується на рекурсивному спуску, потрібно вказати для функції допоміжні параметри:

D – параметр-значення типу LongInt: для передавання значення добутку поточного значення факторіалу на черговий множник;

M – параметр-значення типу Integer: кінцеве значення поточного множника (для забезпечення незалежності рекурсивної функції від імені конкретної глобальної змінної);

i – параметр-значення типу Integer: значення поточного множника.

Отже, програма, в якій використовується рекурсивна функція, що виконує обчислення при рекурсивному спуску, може мати вигляд:

var N : Integer;

function Fact(D : LonhInt; i, M : Integer):LongInt;

begin D := D * i;

if i=M then Fact := D

else Fact:=Fact(D, i+1, M);

end;

begin Write('N = ',N); ReadLn(N);

WriteLn(N,'! = ',Fact(1,1,N));

end.

У таблиці покрокового виконання програми, наведеній нижче, розглянуто приклад для N = 5.

Поточний рівень рекурсії

Рекурсивний спуск

Рекурсивне повернення

0

Введення N=5;

Fact(1, 1, 5);

Виведення: 5! = 120

1

D := 1 * 1 (2);

i := 1;

Fact(1, 2, 5);

Fact := 120;

2

D := 1 * 2 (2);

i := 2;

Fact(2, 3, 5);

Fact := 120;

3

D := 2 * 3 (6);

i := 3;

Fact(6, 4, 5);

Fact := 120;

4

D := 6 * 4 (24);

i := 4;

Fact(24, 5, 5);

Fact := 120;

5

D := 24 * 5 (120);

i := 5;

Fact := 120;

Fact := 120;