Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АМ_5_LR_6.doc
Скачиваний:
6
Добавлен:
23.08.2019
Размер:
131.07 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Прикарпатський національний університет

імені Василя Стефаника

Кафедра радіофізики і електроніки

Лабораторна робота №5

з дисципліни

"Алгоритми та методи обчислень"

рекурсія

Івано-Франківськ – 2011

Мета роботи:

- оволодіти навичками роботи з рекурсивними тріадами;

- навчитися вирішувати завдання з використанням рекурсії.

Теоретичні відомості

Ключові терміни:

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

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

Декомпозиція - це вираз загального випадку через більш прості підзадачі зі зміненими параметрами.

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

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

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

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

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

Пряма рекурсія - це безпосереднє звернення рекурсивної функції до себе, але з іншим набором вхідних даних.

Рекурсивна тріада - це етапи рішення завдань рекурсивним методом.

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

Рекурсивний алгоритм - це алгоритм, у визначенні якого міститься прямий або непрямий виклик цього ж алгоритму.

Рекурсія - це визначення об'єкта за допомогою посилання на себе.

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

Рекурсія - це визначення об'єкта через звертання д самої себе.

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

Прямий виклик функції до самої себе припускає, що в тілі функції міститься виклик цієї ж функції, але з іншим набором фактичних параметрів. Такий спосіб організації роботи називається прямою рекурсією. Наприклад, щоб знайти суму перших n натуральних чисел, треба суму перших (n-1) чисел скласти із числом n, тобто має місце залежність: Sn=Sn-1+n. Обчислення відбувається за допомогою аналогічних міркувань.

При непрямому виклику функція містить виклики інших функцій зі свого тіла. При цьому одна або декілька з функцій, що викликається, на певному етапі звертається до вихідної функції зі зміненим набором вхідних параметрів. Така організація викликів називається непрямою рекурсією. Наприклад, пошук максимального елемента в масиві розміру n можна здійснювати як пошук максимуму із двох чисел: одне із яких - це останній елемент масиву, а інше є максимальним елементом у масиві розміру (n-1). Для знаходження максимального елемента масиву розміру (n-1) застосовуються аналогічні міркування. У підсумку рішення зводиться до пошуку максимального з перших двох елементів масиву.

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

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

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

Виділення бази рекурсії припускає знаходження в розв'язуваному завданні тривіальних випадків, результат для яких очевидний і не вимагає проведення розрахунків. Вірно знайдена база рекурсії забезпечує завершеність рекурсивних викликів, які в остаточному підсумку зводяться до базового випадку. Перевизначення бази або її динамічне розширення в ході рішення завдання часто дозволяють оптимізувати рекурсивний алгоритм за рахунок досягнення базового випадку за більш короткий шлях викликів.

Декомпозиція являє собою відомості загального випадку до більш простих підзадачам, які відрізняються від вихідного завдання набором вхідних даних. Декомпозиційні залежності описують не тільки зв'язок між завданням і підзадачами, але і характер зміни значень параметрів на черговому кроці. Від обраних відносин залежить трудомісткість алгоритму, тому що для одного і того ж завдання можуть бути складені різні залежності. Перегляд відносин декомпозиції доцільно проводити комплексно, тобто паралельно з корегуванням параметрів і аналізом базових випадків.

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

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

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

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

Будемо використати наступні позначення для конкретного вхідного параметра D:

R(D) – загальне число вершин дерева рекурсії,

RV(D) – обсяг рекурсії без листів (внутрішні вершини),

RL(D) – кількість листів дерева рекурсії,

HR(D) – глибина рекурсії.

Наприклад, для обчислення n-го члена послідовності Фибоначчи розроблена наступна рекурсивна функція:

int Fib(int n){ //n – номер члена послідовності

if(n<3) return 1; // база рекурсії

return Fib(n-1)+Fib(n-2); // декомпозиція

}

Тоді повне дерево рекурсії для обчислення п'ятого члена послідовності Фібоначчі буде мати вигляд (рис. 1):

Рисунок 1.  Повне дерево рекурсії для п'ятого члена послідовності Фібоначчі

Характеристиками методу оцінки алгоритму, що розглядається, будуть наступні величини.

D = 5

D = n

R(D)=9

R(D)=2fn-1

RV(D)=4

RV(D)=fn-1

RL(D)=5

RL(D)=fn

HR(D)=4

HR(D)=n-1

Методичні вказівки

В даній роботі пропонується написати програму обраною мовою програмування, у якій скористатися рекурсією відповідно до завдання.

Завдання необхідно вирішити відповідно до вивчених рекурсивних методів рішення завдань і методами обробки числових даних.

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

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

Література

1. Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и алгоритмы. – М.: Издательский дом “Вильямс”, 2001. – 384 с.

2. Вирт Н. Структуры данных и алгоритмы. С примерами на Паскале. Издание 2. – СПб.: Невский диалект, 2008. – 352 с.

3. Кнут Д. Искусство программирования для ЭВМ / В 3-х томах. – М.: “Мир”, 2008.

4. Новиков Ф. А. Дискретная математика для программистов. Учебник для вузов. 2-е изд. – СПб.: Питер, 2005. – 364 с.

Завдання

1. Вивчіть словесну постановку завдання, виділивши при цьому всі види даних;

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

3. Відобразіть етапи рекурсивної тріади у математичній моделі;

4. Сформулюйте математичну постановку завдання;

5. Виберіть метод рішення завдання, якщо це необхідно;

6. Методом процедурної абстракції, використовуючи рекурсивні функції, розробіть програму для рішення завдання.

7. Запишіть розроблений алгоритм обраною мовою;

8. Розробіть контрольний тест до програми;

9. Налагодьте програму;

10. Представте звіт роботі.

11. Програму супроводьте коментарями в коді.

Вимоги до звіту

Звіт до лабораторної роботи повинен відповідати наступній структурі:

- титульний лист.

- словесна постановка завдання. У цьому підрозділі проводиться повний опис завдання. Описується суть завдання, аналіз вхідних даних, область їх припустимих значень, одиниці їхнього виміру, можливі обмеження, аналіз умов при яких завдання має рішення (не має рішення), аналіз очікуваних результатів.

- математична модель. У цьому підрозділі вводяться математичні описи дпних і математичний опис їхньої взаємодій. Ціль підрозділу - подати розв'язуване завдання у математичному формулюванні.

- алгоритм рішення завдання. У підрозділі описується розробка структури алгоритму, обґрунтовується абстракція даних, завдання розбивається на підзадачі.

- лістинг програми. Підрозділ повинен містити текст програми обраною мовою програмування.

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

- висновки по лабораторній роботі.

- відповіді на контрольні питання.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]