Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
15.01.2021
Размер:
48.53 Кб
Скачать

6

Лекція 3. Рекурсія

3.1. Поняття рекурсії

3.2. Прості рекурсивні алгоритми

3.2.1. Алгоритм знаходження n!

3.2.2. Алгоритм знаходження чисел Фібоначчі

3.3. Рекурсивні алгоритми обернення рядка

4. Переваги і недоліки рекурсії.

3.1. Поняття рекурсії

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

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

У програмуванні під рекурсією розуміють таку реалізацію, в якій метод використовує у своєму тілі виклик самого себе. Такі виклики називають рекурсивними. Якщо метод A у своєму тілі викликає тільки один рекурсивний метод, то говорять про пряму рекурсію. Під непрямою рекурсією розуміють явище, коли рекурсивні методи викликають один одного (наприклад, метод А викликає B, а метод B викликає A).

Пряма рекурсія

Непряма рекурсія

void A(){

Оператори;

A();

Оператори;

}

void A(){

Оператори;

B();

Оператори;

}

void B(){

Оператори;

A();

Оператори;

}

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

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

Таким чином, ми можемо говорити про два типи алгоритмів:

  1. ітераційні;

  2. рекурсивні.

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

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

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

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

Таким чином, кожний рекурсивний метод складається з двох частин:

- базового випадку;

- рекурсивного випадку.

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

Як працює рекурсивний виклик методу?

Якщо метод викликає сам себе, то в пам'яті відбуваються такі процеси:

- в системному стеку виділяється пам'ять для нових локальних змінних і параметрів (це називається стеком викликів);

- програмний код методу виконується спочатку з новими локальними змінними і параметрами. Ці локальні змінні і параметри отримують нові початкові значення. Сам програмний код методу не копіюється;

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