
- •Область дії ідентифікаторів при використанні підпрограм
- •Класифікація способів передавання параметрів
- •Передавання параметрів засобами мови Паскаль
- •Вхідний і вихідний параметр за адресою (називають параметр-змінна).
- •Вхідний параметр за адресою (називають параметр-константа).
- •Рекурсія: основні поняття та визначення
- •Форми рекурсивних підпрограм
- •Виконання дій при рекурсивному спуску
- •Виконання дій при рекурсивному поверненні
- •Виконання дій як при рекурсивному спуску так і при рекурсивному поверненні
- •Швидке упорядкування
- •Порівняння функції і процедури
Передавання параметрів засобами мови Паскаль
Засобами мови Паскаль реалізовано три способи передавання параметрів:
Вхідний параметр за значенням (називають параметр-значення).
При описі заголовків підпрограм перед ідентифікатором параметра-значення службових слів не вказують.
Заголовок процедури(функції) з описаним параметром-значення має такий вигляд:
procedure NameProc(Param : TypeParam);
Механізм використання параметра-значення спрощено можна подати так:
Фактичний параметр |
До комірки пам’яті формального параметра передається копія фактичного і назад не повертається |
Формальний параметр |
|
Як фактичний параметр-значення може використовуватися змінна або константа різних типів, крім файлових.
Вхідний і вихідний параметр за адресою (називають параметр-змінна).
При описі заголовків підпрограм перед ідентифікатором параметра-змінної вказують службове слово var.
Заголовок процедури (функції) з описаним параметром-змінною має такий вигляд:
procedure NameProc(var Param : TypeParam);
Механізм використання параметра-змінної спрощено можна подати так:
Фактичний параметр |
Передається адреса фактичного параметра |
Формальний параметр |
|
||
|
||
За переданою адресою змінюється вміст комірок пам’яті фактичного параметра, тобто виконується повернення результату. |
Як фактичний параметр-змінна може використовуватися тільки змінна різних типів.
Вхідний параметр за адресою (називають параметр-константа).
При описі заголовків підпрограм перед ідентифікатором параметра-константи вказують службове слово const.
Заголовок процедури(функції) з описаним параметром-константою має такий вигляд:
procedure NameProc(const Param : TypeParam);
Механізм використання параметра-константи спрощено можна подати так:
Фактичний параметр |
Передається адреса фактичного параметра |
Формальний параметр |
|
||
Дозволяється використовувати значення фактичного параметра за переданою адресою, а змінювати не можна. |
Як фактичний параметр-змінна може використовуватися змінна або константа різних типів, крім файлових. Не дозволяється надавати значень формальному параметру-константі. Формальний параметр-константа не можна передавати як фактичний параметр іншим підпрограмам.
Параметри-константи доцільно використовувати у випадку, якщо потрібно передавати структури даних, які займають значний об’єм пам’яті, але змінювати вхідні значення параметрів за алгоритмом не потрібно.
Рекурсія: основні поняття та визначення
Рекурсивним називається об’єкт, який частково визначається через самого себе. Рекурсивні визначення як потужний аналітичний апарат використовується в багатьох галузях науки, особливо в математиці.
Розглянемо функцію факторіала n!. Як правило, її визначають як добуток перших n цілих чисел:
Математичне визначення |
Програма |
n! = 1 • 2 • 3 • … • n |
var F : LongInt; n, i : Integer; begin Write('n='); ReadLn(n); F := 1; for i := 1 to n do F := F * i; WriteLn(n,'!=',F); end. |
Але існує також інше визначення факторіала, в якому використовується рекурентна формула:
Математичне визначення |
Програма |
1. 0! = 1 2. для n > 0 n! = n•(n – 1)! |
var n : Integer; function Fact(i : Integer) : LongInt; begin if i = 1 then Fact := 1 else Fact := i * Fact(i - 1) end; begin Write('n='); ReadLn(n); WriteLn(n,'!=',Fact(n)); end. |
Визначення за допомогою рекурентних формул іноді називають рекурсивними визначеннями. Якщо для факторіала перше визначення здається простіше, то для чисел Фібоначі рекурсивне визначення більш вдале для обчислень, ніж пряма формула:
рекурсивне визначення |
пряма формула |
1. F(1) = 1, 2. F(2) = 1, 3. для n > 2 F(n) = F(n – 1) + F(n – 2) |
|
Зміст і потужність рекурсивного визначення, а також його головне призначення полягає в тому, що за допомогою скінченного виразу визначається нескінченна множина об’єктів. Аналогічно, за допомогою скінченного рекурсивного алгоритму можна визначити нескінченний процес, причому алгоритм не буде мати повторень фрагментів тексту.
Для створення рекурсивних алгоритмів необхідно і достатньо наявності поняття процедури або функції. Це випливає з того, що з використанням процедур і функцій можна надати будь-якій послідовності дій (операторів) ім’я, за допомогою якого можна буде цю послідовність дій викликати. Програми, у яких використовуються рекурсивні підпрограми відрізняються простотою, наочністю і компактністю тексту. Такі якості рекурсивних алгоритмів випливають з того, що рекурсивна підпрограма вказує на те, що потрібно виконати, не рекурсивна здебільшого акцентує увагу на тому, як потрібно виконати.
Використання рекурсивних підпрограм потребує додаткового виділення оперативної пам’яті при кожному рекурсивному викликові для локальних змінних, а також для параметрів-значень підпрограми.
Найбільше число рекурсивних викликів підпрограми без повернень, яке відбувається при виконанні програми, називається глибиною рекурсії. Число рекурсивних викликів у поточний момент часу називається поточним рівнем рекурсії.