
- •Область дії ідентифікаторів при використанні підпрограм
- •Класифікація способів передавання параметрів
- •Передавання параметрів засобами мови Паскаль
- •Вхідний і вихідний параметр за адресою (називають параметр-змінна).
- •Вхідний параметр за адресою (називають параметр-константа).
- •Рекурсія: основні поняття та визначення
- •Форми рекурсивних підпрограм
- •Виконання дій при рекурсивному спуску
- •Виконання дій при рекурсивному поверненні
- •Виконання дій як при рекурсивному спуску так і при рекурсивному поверненні
- •Швидке упорядкування
- •Порівняння функції і процедури
Форми рекурсивних підпрограм
У загальному випадку будь-яка рекурсивна підпрограма 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 |
|
|
Fact(1, 1, 5); |
|
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; |