Рекурсия. Перебор. Методы сокращения перебора

Содержание

Слайд 2

Рекурсия. Определение В программировании рекурсия — вызов функции (процедуры) из неё

Рекурсия. Определение

В программировании рекурсия — вызов функции (процедуры) из неё же

самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция А вызывает функцию B, а функция B — функцию A.
Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.
Преимущество рекурсивного определения объекта заключается в том, что такое конечное определение теоретически способно описывать бесконечно большое число объектов. С помощью рекурсивной программы же возможно описать бесконечное вычисление, причём без явных повторений частей программы.
Слайд 3

Рекурсия. Основные положения Рекурсию надо использовать там, где она реально необходима.

Рекурсия. Основные положения

Рекурсию надо использовать там, где она реально необходима.
Числа Фибоначчи

и факториалы – плохой пример использования рекурсии
Рекурсия – это всего лишь вызов подпрограммы в самой себе
Рекурсия используется для разбиения задачи на подзадачи и решения задачи с объемом меньше, чем исходная.
Слайд 4

Примеры использования рекурсии Поиск в глубину в графе Сортировка слиянием «Быстрая»

Примеры использования рекурсии

Поиск в глубину в графе
Сортировка слиянием
«Быстрая» сортировка (Хоара)
Обход различного

рода деревьев (в повседневной жизни – дерево каталогов)
Практически незаменима в переборных задачах
Слайд 5

Стек вызовов Рекурсия использует системный стек для запоминания вызываемых подпрограмм и

Стек вызовов

Рекурсия использует системный стек для запоминания вызываемых подпрограмм и их

параметров
Следите за стеком.
Изменение размера стека:
Pascal: {$M <размер стека в байтах>, <максимальный размер стека>}
С++: #pragma comment(linker, "/STACK:<размер стека в байтах>")
Слайд 6

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

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

Слайд 7

Перебор с помощью рекурсии Даны N упорядоченных множеств U1, U2, …,

Перебор с помощью рекурсии

Даны N упорядоченных множеств U1, U2, …, UN

(N – неизвестно)
Требуется построить вектор A = (a1, a2, …, aN)
A1є U1, A2є U2, …, ANє UN
В алгоритме перебора вектор строится покомпонентно слева направо
Слайд 8

Перебор с помощью рекурсии. Общая схема

Перебор с помощью рекурсии. Общая схема

Слайд 9

Перебор с помощью рекурсии. Схема реализации Procedure Backtrack ( ); Begin

Перебор с помощью рекурсии. Схема реализации

Procedure Backtrack (<вектор,i>);
Begin
If <вектор является решением>


Then <записать его>
Else Begin
<вычислить Si>;
For Do
Backtrack (<вектор + а>,i+1) ;
End;
End;