Произвольное количество вложенных циклов
Разместив рекурсивные вызовы внутри цикла, по сути, получим вложенные циклы, где уровень вложенности равен глубине рекурсии.
Для примера напишем процедуру, печатающую все возможные сочетания из k чисел от 1 до n ( ). Числа, входящие в каждое сочетание, будем печатать в порядке возрастания. Сочетания из двух чисел (k=2) печатаются так:
for i1 := 1 to n do for i2 := i1 + 1 to n do writeln(i1, ' ', i2); |
Сочетания из трех чисел (k=3) так:
for i1 := 1 to n do for i2 := i1 + 1 to n do for i3 := i2 + 1 to n do writeln(i1, ' ', i2, ' ', i3); |
Однако, если количество чисел в сочетании задается переменной, то придется прибегнуть к рекурсии.
procedure Combinations( n, k: integer; //Массив, в котором будем формировать сочетания var Indexes: array of integer; //Счетчик глубины рекурсии d: integer); var i, i_min: integer; s: string; begin if d < k then begin if d = 0 then i_min := 1 else i_min := Indexes[d-1] + 1; for i := i_min to n do begin Indexes[d] := i; Combinations(n, k, Indexes, d+1); end; end else begin for i := 0 to k-1 do write(Indexes[i], ' '); writeln; end; end; |
Задачи на графах
Графом называют графическое изображение, состоящее из вершин (узлов) и соединяющих некоторые пары вершинребер (рис. 11а).
Более строго: граф – совокупность множества вершин и множества ребер. Множество ребер – подмножество евклидова квадрата множества вершин (то есть ребро соединяет ровно две вершины).
Ребрам можно также присвоить направление. Граф в этом случае называется ориетированным (рис. 11б).
Рис. 11. (а) Граф. (б) Ориентированный граф.
Теория графов находит применения в самых разных областях. Несколько примеров:
1. Логистика и транспортные системы. Вершинами будут склады с товарами или пункты назначения, а ребра – дороги, их соединяющие.
2. Маршрутизация сетей. Вершины – компьютеры, соединенные в сеть, ребра – связи между ними. Решается задача о путях передачи данных с одного компьютера на другой.
3. Компьютерная химия. Модели в виде графов используются для описания путей протекания сложных реакций. Вершины – участвующие в реакциях вещества, ребра – пути превращений веществ. Также графом является изображение структур молекул: вершины – атомы, ребра – химические связи.
4. Электрические сети.
5. Сайты в Интернете можно считать узлами ориентированного графа, ребрами которого будут гиперссылки.
6. И т. д.
Современная теория графов представляет собой мощную формальную систему, имеющую необозримое множество применений.
Путем или цепью в графе называется последовательность вершин, в которой каждая вершина соединена ребром со следующей. Пути, в которых начальная и конечная вершина совпадают, называют циклами. Если для каждой пары вершин существует путь их соединяющих, то такой граф называют связным.
В программировании используются три способа хранения в памяти информации о стуктуре графов.
1) Матрицы смежности
Квадратная матрица M, где как строки, так и столбцы соответствуют вершинам графа. Если вершины с номерами i и j соединены ребром, то Mij = 1, иначе Mij = 0. Для неориентированного графа матрица, очевидно, симметрична. Ориентированный граф задается антисимметричной матрицей. Если ребро выходит из узла i и приходит в узел j, то Mij = 1, а симметричный элемент Mji = -1.
2) Матрица инцидентности
Столбцы матрицы соответствуют вершинам, а строки ребрам. Если ребро с номером i соединяет вершины с номерами j иk, то элементы матрицы Iij = Iik = 1. Остальные элементы i-й строки равны 0.
3) Список ребер
Просто набор пар номеров вершин, соединенных ребрами.
Рассмотренные выше деревья являются частным случаем графов. Деревом будет любой связный граф, не содержащий циклов.
Задачи, возникающие в теории графов многочисленны и разнообразны. Про них пишутся толстые книги, и нет никакой возможности сколько-нибудь полно их здесь обозреть. Поэтому мы ограничимся замечанием, что многие из этих задач требуют систематического перебора вершин. Если перебирать вершины, связанные ребрами и при этом посещать каждую вершину только один раз, то множество посещаемых алгоритмом вершин будет образовывать дерево, а сам алгоритм естественно сделать рекурсивным.
Например, классической задачей является поиск пути из одной вершины в другую. Алгоритм поиска должен будет построить дерево возможных путей из начальной вершины, концевыми узлами которого будут вершины, из которых нельзя попасть ни в какую вершину, не принадлежащую ранее построенной ветви (не помеченную как уже посещенную). Задача будет решена, когда один из концевых узлов совпадет с конечной вершиной, путь в которую требуется найти.
Фракталы
Фракталами называют геометрические фигуры, обладающие свойством самоподобия, то есть состоящие из частей, подобных всей фигуре.
Классическим примером является кривая Коха, построение которой показано на рис. 12. Изначально берется отрезок прямой (рис. 12а). Он делится на три части, средняя часть изымается и вместо нее строится угол (рис. 12б), стороны которого равны длине изъятого отрезка (то есть 1/3 от длины исходного отрезка). Такая операция повторяется с каждым из получившихся 4-х отрезков (рис. 12в). И так далее (рис. 12г). Кривая Коха получается после бесконечного числа таких итераций. На практике построение можно прекратить, когда размер деталей окажется меньше разрешения экрана (рис. 12д).
Рис. 12. Процесс построения кривой Коха.
Еще одним примером может служить деревце на рис. 6. Оно также содержит части, подобные всему дереву в целом, что делает его фракталом.
Фракталы, по сути, рекурсивные структуры и их построение естественно производить с помощью рекурсивных процедур.
Дата добавления: 2016-07-05; просмотров: 2482;