Рекурсия и рекурсивни функции в езика C++
-
Upload
georgi-mirchev -
Category
Documents
-
view
2.238 -
download
3
description
Transcript of Рекурсия и рекурсивни функции в езика C++
![Page 1: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/1.jpg)
13.04.2023 г.1
Рекурсия и рекурсивни функции в езика C++
![Page 2: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/2.jpg)
13.04.2023 г.2
Произход на думата рекурсия
„Rеcur“ – от анлг. език: връщам се, случвам се отново.Примери:
![Page 3: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/3.jpg)
13.04.2023 г.3
Определение за рекурсия
Рекурсия е програмна техника, при която даден метод извиква сам себе си при решаването на определен проблем. Такива методи наричаме рекурсивни.
Още два примера:
![Page 4: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/4.jpg)
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++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/5.jpg)
13.04.2023 г.5
Видове рекурсия Пряка рекурсия - в тялото на метод
се извършва обръщение към същия метод.
Косвена рекурсия - Ако метод A се обръща към метод B, B към C, а С отново към А, казваме, че методът А, както и методите В и C са непряко (косвено) рекурсивни
Пример (Непряка рекурсия):
![Page 6: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/6.jpg)
13.04.2023 г.6
Реализация на числата на Фибоначи
double fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2);}
Пример за пряка рекурсия
![Page 7: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/7.jpg)
13.04.2023 г.7
Дъно на рекурсията
Трябва да имаме поне един случай, чието решение можем да намерим директно, без рекурсивно извикване. Тези случаи наричаме дъно на рекурсията.Пример с числата на Фибоначи:
if (n <= 2) return 1;
Дъно
![Page 8: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/8.jpg)
13.04.2023 г.8
Рекурсия vs. Итерация
![Page 9: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/9.jpg)
13.04.2023 г.9
Рекурсията : По-четлива и елегантна от итеративното
решение.
Консумира повече памет и ресурси.
Понякога можем да постигнем по-просто решение от итеративното.
А понякога постигаме много по-сложно.
![Page 10: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/10.jpg)
13.04.2023 г.10
Как да създадем рекурсивен метод ?
Разбиване на задачата на подзадачи
Подзадачите трябва да се стремят да стигнат дъното на рекурсията.
Комбинирането на решенията на подзадачите да получава решението на цялата задача.
![Page 11: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/11.jpg)
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++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/12.jpg)
13.04.2023 г.12
Реализация на C++
double factorial(int n) { // Дъно на рекурсията if (n == 0) return 1; // Рекурсивно извикване: Методът извиква себе си else return n * factorial(n - 1); }
![Page 13: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/13.jpg)
13.04.2023 г.13
Числата на Фибоначи – неефективна реализация
Имаме много повтарящи се изчисления.
![Page 14: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/14.jpg)
13.04.2023 г.14
Изводи: Избягвайте рекурсията ако не сте сигурни как работи.
Винаги търсете и итеративни решения, за да имате база за сравнение.
Ако постигаме по-просто, кратко и по-лесно за разбиране решение, като това не е за сметка на ефективността и не предизвиква други странични ефекти, тогава можем да предпочетем рекурсията.
![Page 15: Рекурсия и рекурсивни функции в езика C++](https://reader031.fdocuments.net/reader031/viewer/2022020716/557b8ea5d8b42a333a8b52c0/html5/thumbnails/15.jpg)
13.04.2023 г.15
Изготвил: Георги МирчевФак. Номер: 0901261023