Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornye_raboty_asd.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.37 Mб
Скачать

4 Вихідні дані роботи

Вершини дерева задаються літерами. Ознака кінця тексту - точка. Порожні піддерева позначаються зірочками, тобто задається вид дерева.

  1. Хід виконання практичної роботи

Приклад тексту, що вводиться - СТУ *** ДЕ * Н ** Т **. При роботі з деревом використовуються рекурсивні алгоритми.

Type uk2 = ^ tree;

tree = record (* тип елемента дерева *)

inf: char;

Itree, rtree: uk2;

end;

var root: uk2;

s: string;

i: integer;

procedure create (var link: root); (* створення дерева *)

var pt: uk2;

begin

i: = i +1;

if s [i] <> '.' Then

if s [i] <> '*' then

begin

new (pt);

pt ^. inf: = s [i];

link: = pt;

create (link ^. ltree);

create (link ^. rtree);

else

link: = nil;

end;

procedure prefix (link: uk); (* префіксний обхід *)

begin

if link <> nil then

begin

writeln (link ^. inf);

prefix (link ^. ltree);

prefix (link ^. rtree);

end; end;

procedure Infix (link: uk); ("інфіксний обхід *)

begin

if link <> nil then

begin

prefix (link ^. ltree);

writeln (link ^. inf);

prefix (link ^. rtree);

end;

end;

procedure Postfix (link: uk); (* постфіксной обхід *)

begin

if link <> nil then

begin

prefix (link ^. ltree);

prefix (link ^ .. rtree);

writeln (link ^. inf);

end; end;

begin

writeln ('задайте рядок');

read (s);

{Створення дерева}

i: = 0;

create (root);

{Дерево створено}

Prefix (root); (* обхід в префіксной формі *)

Infix (root); (* обхід в інфіксной формі *)

Postfix (root); (* обхід в постфіксной формі *)

end.

Питання до захисту :

Поняття дерева загального вигляду?

Відповідь:____________________________________________________

_____________________________________________________________

Що називають ступенем вузла?

Відповідь:____________________________________________________

_____________________________________________________________

Яке дерево називають орієнтованим?

Відповідь:________________________________________

_________________________________________________

Властивості дерев?

Відповідь:____________________________________________________

_____________________________________________________________

Роботу виконав Роботу перевірив

Лабораторна робота №5 «Побудова рекурсивних функцій»

1 Тема роботи: Написання програми з використанням рекурсії

2 Мета роботи: Формування знань і умінь по роботі з підпрограмами. Придбання навичок написання програм з використанням рекурсивних процедур і функцій.

3 Теоретичний матеріал

Рекурсія - це такий спосіб організації обчислювального процесу, при якому процедура або функція в ході виконання складових її операторів звертається сама до себе.

Прикладом програми з використанням рекурсії може бути програма обчислення факторіала числа. (Факторіалом натурального числа n називають добуток чисел 1 * 2 * ... * n.)

{Обчислення факторіала числа n з використанням рекурсивної функції}

program Demo_Rekurs;

var

N: integer;

F: longint;

{Опис функції, N - формальний параметр-значення типу integer, результат виконання функції типу longint}.

function Fakt (N: integer): longint;

begin {Початок обчислення функції}

if N = 1 then Fakt: = 1 {Перевірка умови завершення рекурсії}

else Fakt: = N * Fakt (N-1); {Рекурсивне обчислення N!}

end;

begin {Початок головної програми}

Writeln ('Введіть число N:');

Read (N);

F: = Fakt (N); {Виклик функції для фактичного параметра N}

Writeln ('Для числа', N, 'значення факторіала =', F);

end.

Після запуску програми на екран виводиться запит: "Введіть число N:", потім з клавіатури зчитується значення цілого числа N і в вираженні F: = Fakt (N) викликається функція Fakt з параметром-значенням N. У підпрограмі-функції обчислення факторіала перевіряється умова N = 1. Якщо воно виконується, то функції Fakt присвоюється значення 1, на цьому виконання підпрограми-функції завершується. Якщо умова N = 1 не дотримується, то виконується обчислення добутку N * Fakt (N-1). Обчислення добутку носить рекурсивний характер, так як при цьому здійснюється виклик функції Fakt (N-1), значення якої обчислюється, в свою чергу, через виклик функції Fakt, параметром якої також буде функція Fakt, і т. д., до тих пір, поки значення формального параметра N = 1. Так як базова частина опису рекурсивної функції Fakt визначає значення Fakt для N = 1, рівним одиниці, то рекурсивні виклики функції Fakt більше не виконуються, а навпаки, виконується обчислення функції Fakt для чисел, зростаючих від 1 до N, причому функція Fakt всякий раз повертає значення, рівне добутку чергового k-гo числа на факторіал від k-1-го числа. Останнє повернення результату обчислення функції Fakt присвоїть змінній F значення твори всіх чисел від 1 до N, тобто факторіал числа N.

При виконанні рекурсивної підпрограми здійснюється багаторазовий перехід від деякого поточного рівня організації алгоритму до нижнього рівня послідовно до тих пір, поки, нарешті, не буде отримано тривіальне рішення поставленої задачі. У розглянутому вище прикладі рішення при N = 1 тривіально, тобто Fakt = l. Потім здійснюється повернення на верхній рівень з послідовним обчисленням значення функції Fakt.

Нетрадиційне використання підпрограм. Непряма рекурсія

Існують випадки нетрадиційного оголошення підпрограм, коли в оголошенні процедури міститься директива interrupt (переривання), external (зовнішня) або inline (вбудована) або замість блоку в оголошенні процедури або функції написано forward (випереджальна).

Interrupt (переривання). Оголошення процедури може містити директиву interrupt перед блоком, і тоді процедура розглядається як процедура переривання. Перериванням називається тимчасове припинення процесу, викликане подією, зовнішнім по відношенню до цього процесу. Необхідність у процедурах переривання виникає, коли програміст вирішує визначити власні алгоритми реакції на переривання операційної системи, скасувавши при цьому стандартні реакції. Процедури переривання не можна викликати за допомогою операторів процедур і що кожна процедура переривання повинна задавати список параметрів так:

procedure MyInt (Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt;

де CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP - регістри процесора.

Зовнішні оголошення (external). Зовнішні оголошення дозволяють пов'язувати окремо скомпільовані процедури і функції, написані на мові асемблера. За допомогою директиви {$ L ім'я файлу} зовнішню програму можна пов'язати з програмою або модулем.

Приклад оголошення зовнішньої процедури:

procedure MoveWord (var Source, Dest; Count: Word); external;

У тексті програми при оголошенні зовнішніх підпрограм потрібно задати директиву компілятору $ L, аргументом якої є ім'я OBJ-файлу, що містить код підключається підпрограми, наприклад: {$ L BLOCK. OBJ}

Inline (вбудована). Директива inline дозволяє записувати інструкції в машинному коді, не використовуючи блок операторів. При виклику звичайної процедури компілятор створює код, в якому параметри процедури поміщаються в стек, а потім для виклику процедури генерується інструкція call. Коли викликається внутрішня процедура, компілятор генерує код з директиви inline замість call. Таким чином, inline-процедура "розширюється" при кожному зверненні до неї аналогічно макрокоманді на мові асемблера. (Макрокоманда-macro-пропозиція мови програмування, замість якого компілятор при трансляції записує кілька машинних команд.)

Випереджаючі оголошення (forward). Крім прямих рекурсій, розглянутих раніше, рекурсивний виклик може бути і непрямим, тобто одна процедура викликає іншу процедуру, яка, в свою чергу, викликає першу процедуру. А так як до виклику процедури вона обов'язково повинна бути описана, то використовується випереджальне оголошення: процедура містить опис лише свого заголовка, слідом за яким ставиться зарезервоване слово forward (випереджаюче), а опис тексту процедури поміщається далі в тексті програми Гуже без повторення опису списку формальних параметрів і називається визначальним оголошенням.

Випереджальне оголошення і визначальне оголошення повинні знаходитися в одній і тій же частині оголошення процедур і функцій. Між ними можуть бути оголошені інші процедури і функції, і вони можуть викликати процедуру з випереджаючим оголошенням. Таким чином, можлива взаємна рекурсія. Визначальний оголошення процедури може бути external або assembler. Однак воно не може бути near-; far-; inline-або іншим forward-оголошенням. Визначальний оголошення також не може містити директиви interrupt, near або far. Випереджаючі оголошення не допускаються в інтерфейсній частині модуля.