
- •Результати операцій над логічними даними:
- •Var ім 'я_масиву:аrrау[t1 ] of t2;
- •Var ім’я_масиву: ім'я_типу;
- •Var ім’я_мас:ім 'я_типу;
- •Процедури.
- •Структура процедури.
- •Параметри-значення та параметри-змінні.
- •Функції.
- •Відмінні особливості функції в порівнянні з процедурами:
- •Рекурсивні структури.
- •If умова then a;
- •If умова then a;
- •If умова then a;
- •Множини.
Рекурсивні структури.
Ще одним складним типом є рекурсивні структури. Ітерація - це виконання якого-небудь процесу, що повторюється, до тих пір, поки не буде задоволена деяка умова. Причому, кожного разу виконання проводиться повністю, перевіряється умова і якщо вона не задовільняється, починається нове виконання.
На відміну від ітерації, рекурсія характеризується самовикликанням процесу, який виконується. Виконання не здійснюється повністю перед перевіркою умови, але перевірка умови входить в процес виконання, і при негативному результаті перевірки потрібно виконати все спочатку вже в якості підпрограми для ще не виконаної до кінця початкової програми. В якості ілюстрації рекурсивних структур можна розглянути наступне речення: "Я сказав, що ви думаєте, що він дуже розумний". Рекурсія визначається в деякій мірі через саму себе. Дану аналогію можна розповсюджувати на структури даних, що відповідають рекурсивним процедурам. Значення такого типу повинні містити більше однієї компоненти, що належить до того ж типу даних, що і саме значення, подібно до того, як рекурсивна процедура може викликати себе рекурсивно в своєму ж власному тілі, більш ніж з одного місця. Зручніше всього таку структуру визначати так, щоб ім'я типу що визначається, вживалось в середині свого особистого визначення, або для взаємно-рекурсивних визначень, в визначенні деякого попереднього типу. Самі наочні приклади рекурсивних структур - це конструкції описів арифметичних та логічних виразів різноманітних мов програмування, де рекурсія відображає можливості вживання одного виразу в середині іншого.
Взагалі в результаті застосування вкладених структур даних можна обробляти скільки завгодно складних типів даних.
Добре знайомим прикладом рекурсивно визначених даних є генеологічне дерево (в ньому з кожною людиною зв'язується генеологічне дерево всіх його предків).
Приклад:
Function FIB (n: integer): integer;
Веgіn
If n<=1 then FIB:=l
Else FIB: =FIB(n-l)+FIB(n-2);
End;
Рекурсії мають дві найбільш важливі області застосування:
1. З теоретичної точки зору, рекурсивні визначення є основою всієї сучасної теорії обчислювальних функцій.
2. Друга область застосування обумовлюється тим, що процедури аналізу структур, що є рекурсивними, найбільш ефективні, коли вони самі рекурсивні. Ці процедури повинні в якійсь мірі відображати деякі особливості, які були б необов'язковими при відсутності рекурсії в структурі даних.
Існують деякі функції, які можна легко визначити рекурсивно, але які не можна визначити в термінах звичайних алгебраїчних виразів.
Наприклад, функція Аккермана. Вона визначається для цілих додатніх чисел і для нуля:
А(m,n)=if m=0 then n+1 else
If n=0 then A(m-1,1) else
А(m-1),А (m, n-1);
Об'єм пам'яті обмежує глибину рекурсії, але це не є суттєвим в задачах аналізу речень, де обмеження зв'язані з довжиною вхідних даних, але не з їх структурою.
Розглянемо функцію n!. Як правило її визначають як добуток перших n чисел
N!=1*2*3…n
Такий добуток можна легко обчислити за допомогою інтерактивних конструкцій, наприклад, оператора циклу for
Begin
read(n);
Fact:=1;
For i:=1 to n do
Fact:=fact*I;
Але існує іще одне визначення факторіалу, в якому використовується рекурентна формула, що має такий вигляд:
0!=1
n>0
n!=n*(n-1)!
Визначення за допомогою рекурентних формул іноді називають рекурсивними визначеннями. Програма, яка використовує рекурсивну функцію для обчислення факторіалу має такий вигляд:
Program f;
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’);
Read(n);
Writeln(‘Факт n!= ‘,fact(n));
End.
Для створення рекурсивних алгоритмів необхідно і достатньо наявність поняття процедури чи функції. Це виходить з того, що процедури та функції дозволяють дати любим послідовним діям ім’я, за допомогою якого буде можливо цю послідовність дій викликати.
Програми, в яких використовуються рекурсивні підпрограми відрізняються простотою, наглядністю та компактністю тексту. Однак, при цьому неефективно використовується оперативна пам’ять (під локальні зміні весь час відводяться нові комірки пам’яті).
Головні умови до рекурсивних процедур заключаються в тому, що виклик рекурсивної процедури повинен виконуватися при умові, яка на якомусь рівні рекурсії стане хибною.
Структура рекурсивної процедури може приймати три різні форми:
Форма з виконанням дій до рекурсивного виклику.
Procedure A;
Begin
K;