Рекурсия и рекурсивни функции в езика C++

Preview:

DESCRIPTION

Основна информация относно рекурсията и рекурсивните функции в C++

Citation preview

13.04.2023 г.1

Рекурсия и рекурсивни функции в езика C++

13.04.2023 г.2

Произход на думата рекурсия

„Rеcur“ – от анлг. език: връщам се, случвам се отново.Примери:

13.04.2023 г.3

Определение за рекурсия

Рекурсия е програмна техника, при която даден метод извиква сам себе си при решаването на определен проблем. Такива методи наричаме рекурсивни.

Още два примера:

13.04.2023 г.4

Примери в C++Числата на Фибоначи:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …F1 = F2 = 1

Fi = Fi-1 + Fi-2 (за i > 2)

Факториел на n или n! :f(1)! = 1 f(2)! = 1*2 f(3)! = 1*2*3

f(n)! = n * f(n-1)!

13.04.2023 г.5

Видове рекурсия Пряка рекурсия - в тялото на метод

се извършва обръщение към същия метод.

Косвена рекурсия - Ако метод A се обръща към метод B, B към C, а С отново към А, казваме, че методът А, както и методите В и C са непряко (косвено) рекурсивни

Пример (Непряка рекурсия):

13.04.2023 г.6

Реализация на числата на Фибоначи

double fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2);}

Пример за пряка рекурсия

13.04.2023 г.7

Дъно на рекурсията

Трябва да имаме поне един случай, чието решение можем да намерим директно, без рекурсивно извикване. Тези случаи наричаме дъно на рекурсията.Пример с числата на Фибоначи:

if (n <= 2) return 1;

Дъно

13.04.2023 г.8

Рекурсия vs. Итерация

13.04.2023 г.9

Рекурсията : По-четлива и елегантна от итеративното

решение.

Консумира повече памет и ресурси.

Понякога можем да постигнем по-просто решение от итеративното.

А понякога постигаме много по-сложно.

13.04.2023 г.10

Как да създадем рекурсивен метод ?

Разбиване на задачата на подзадачи

Подзадачите трябва да се стремят да стигнат дъното на рекурсията.

Комбинирането на решенията на подзадачите да получава решението на цялата задача.

13.04.2023 г.11

Примерна реализация на n! Намиране на рекурентна зависимост:

0! = 1 1! = 1*1*0! = 12! = 2*1 = 2*1!3! = 3*2*1 = 3*2!4! = 4*3*2*1 = 4*3! 5! = 5*4*3*2*1 = 5*4! n = n*(n-1)!

Реализация

- Дъно – при n = 0

13.04.2023 г.12

Реализация на C++

double factorial(int n) {  // Дъно на рекурсията  if (n == 0)      return 1;  // Рекурсивно извикване: Методът извиква себе си  else      return n * factorial(n - 1);  }

13.04.2023 г.13

Числата на Фибоначи – неефективна реализация

Имаме много повтарящи се изчисления.

13.04.2023 г.14

Изводи: Избягвайте рекурсията ако не сте сигурни как работи.

Винаги търсете и итеративни решения, за да имате база за сравнение.

Ако постигаме по-просто, кратко и по-лесно за разбиране решение, като това не е за сметка на ефективността и не предизвиква други странични ефекти, тогава можем да предпочетем рекурсията.

13.04.2023 г.15

Изготвил: Георги МирчевФак. Номер: 0901261023

Recommended