Professional Documents
Culture Documents
Лекція 1
Лекція 1
Лекція 1
Рекурсія.
Рекурсивні алгоритми
Лектор:
професор, доктор технічних наук
Мелешко Єлизавета Владиславівна
Рекурсія — процес повторення
чого-небудь самоподібним чином.
Наприклад, вкладені віддзеркалення,
вироблені двома точно паралельними
один одному дзеркалами, є однією з
форм нескінченної рекурсії.
В програмуванні та математиці
об'єкт називається рекурсивним, якщо
він містить сам себе або визначений за
допомогою самого себе.
Якщо процедура р містить явне звертання до самої себе, то вона
називається явно рекурсивною.
Процедура P
const
max = 25;
var
i : integer;
F : array [0..max] of integer;
procedure fibonacci;
Begin
F[0] := 1;
F[1] := 1;
for i := 2 to max do
F[i] := F[ i-1]+F[ i-2];
end;
Точних правил для вибору між рекурсивною й нерекурсивною версіями
алгоритму рішення завдання не існує.
Стислість і виразність більшості рекурсивних процедур спрощує їхнє читання й
супровід.
Але виконання рекурсивних процедур вимагає згачно більше витрат пам'яті і
часу процесора.
Ханойські вежі. Цю задачу придумав
Едуард Люка в XIX столітті.
hanoi(N, A, B, C):
…
// з A на B через С
hanoi(N - 1, A, C, B),
…
// з B на C через A
hanoi(N - 1, B, A, C).
…
Непряма (побічна) рекурсія
Begin
A := 15;
Rec1(A);
End.
Розподіл навпіл – алгоритм, що використовує 2 рекурсивні виклики, кожний з
яких працює приблизно з половиною вхідних даних; його часто використовують
для досягнення істотної економії ресурсів.
Приклад. Нанесення розподілів на лінійку: на ній повинна бути мітка в точці
1/2", мітка трохи коротша через кожні 1/4", ще більш коротка через 1/8" і так далі.
2
Rule 9 Rule
(0,4,2) (4,8,2)
3 10
6 13
Rule Rule Rule Rule
(0,2,1) (2,4,1) (4,6,1) (6,8,1)
4 7 8 11 12 15 16
5
Rule Rule Rule Rule Rule Rule Rule Rule
(0,1,0) (1,2,0) (2,3,0) (3,4,0) (4,5,0) (5,6,0) (6,7,0) (7,0,0)
Реалізація рекурсивних викликів функцій у практично використовуваних
мовах і середовищах програмування, як правило, опирається на механізм
стека викликів – адреси повернення й локальних змінних функцій
записуються в стек, завдяки чому кожний наступний рекурсивний виклик цієї
функції користується своїм набором локальних змінних і за рахунок цього
працює коректно.
Визначення алгоритму
Неформальні Формальні
(математичні моделі)
Словесний опис
властивостей - Машина Тюрінга
- Нормальный алгоритм Маркова
- тощо
Способи запису алгоритмів
Графічний Мовний
якщо х=1 то
розгалуження y:=2
інакше y:=3
поки х<10
початок
цикл поки y:= y+1
z:= z*2
кінець
Загальний вид алгоритму:
введення n; S:=0
пч для i від 1 до n
S:=S+i*i
кц
вивід "S = ", S
кін
Неформальне визначення алгоритму
- вхідних даних
- вихідних даних (результату).
* * * 1 1 1 1 1 * *
Для знаходження значень функції f, заданої в деякому алфавіті, тоді і лише тоді
існує деякий алгоритм, коли функція f обчислювана за Тюрінгом, тобто, коли її
можна обчислити на придатній машині Тюрінга.
Тому важливо точно вказувати припустиму множину вхідних даних, оскільки задача
може бути розв'язною для однієї множини та нерозв'язною для іншої.
Однією з перших задач, для якої було доведено нерозв'язність є проблема зупинки.
Формулюється вона наступним чином:
Маючи опис програми для машини Тюринга, визначити, чи завершить роботу
програма за скінченний час, чи працюватиме нескінченно, отримавши будь-які вхідні
дані.
Алгоритмічно нерозв’язні задачі
• Проблема зупинки
• Проблема самозастосованості
Шукати досконалі числа можна різними способами, але всі вони зводяться до
перебору. Просто можна перебирати не всі підряд числа.
1. Ми малюємо трикутник
2. На наступному кроці на кожній його стороні малюємо ще по трикутнику
3. На наступному - на кожному з отриманих трикутників ще по трикутнику
І т.д.