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

15
Рекурсия и рекурсивни функции в езика C++ 1 7.02.2022 г.

Upload: georgi-mirchev

Post on 13-Jun-2015

2.234 views

Category:

Documents


3 download

DESCRIPTION

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

TRANSCRIPT

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

13.04.2023 г.1

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

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

13.04.2023 г.2

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

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

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

13.04.2023 г.3

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

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

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

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

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)!

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

13.04.2023 г.5

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

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

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

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

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

13.04.2023 г.6

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

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

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

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

13.04.2023 г.7

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

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

if (n <= 2) return 1;

Дъно

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

13.04.2023 г.8

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

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

13.04.2023 г.9

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

решение.

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

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

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

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

13.04.2023 г.10

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

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

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

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

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

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

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

13.04.2023 г.12

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

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

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

13.04.2023 г.13

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

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

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

13.04.2023 г.14

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

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

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

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

13.04.2023 г.15

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