- •4. Назначение и способы реализации на vba циклов со счетчиком. Синтаксис оператора for..
- •7. Иллюстрация сочетания цикла и ветвления ..Методом дихотомии (или методом касательных).
- •11. Одномерные массивы..
- •12. Простейшие методы сортировки: пузырьковая, поиском максимального элемента.
- •13. Двумерные массивы …
- •Вопрос 16. Рекурсия. Рекурсивный алгоритм вычисление факториала.Рекурсивный алгоритм, если его описание содержит обращение к самому себе!Программа рекурсивная, если она вызывает сама себя!
- •Вопрос 17. Рекурсия. Рекурсивный алгоритм вычисление нод(a,b).
- •Вопрос 18. Рекурсия. Задача о Ханойских башнях.
- •Вопрос 19. Стек. Алгоритм проверки правильности расстановки скобок разных типов.
- •Вопрос 20. Двоичные деревья. Алгоритмы обхода узлов двоичного дерева.
- •Вопрос 21. Графы. Алгоритм поиска достижимых вершин графа.
- •Вопрос 15. Процедуры..
Вопрос 20. Двоичные деревья. Алгоритмы обхода узлов двоичного дерева.
Двоичное дерево - либо пустое множество элементов, либо множество состоящее из одного элемента, которое называется корнем двоичного дерева, либо множество элементов, которое состоит из корня двоичного дерева и одного или двух не пересекающихся подмножеств, каждое из которых является двоичным деревом.
Работа с элементами двоичного дерева является нетривиальной задачей и требует использование рекурсии.
Существует три алгоритма обхода узлов двоичного дерева (элементов)
Алгоритм обхода узлов двоичного дерева в префиксном порядке
Шаг 1. Найти корень двоичного дерева и выполнить необходимую операцию (например, напечатать этот корень)
Шаг 2. Пройти левое поддерево в префиксном порядке(рекурсия)
Шаг 3. Пройти правое поддерево в префиксном порядке.
Шаг 4. Закончить работу алгоритма.
Алгоритм обхода узлов двоичного дерева в инфиксном порядке.
Шаг 1. Найти корень двоичного дерева.
Шаг 2. Пройти левое поддерево в инфиксном порядке.
Шаг 3. Выполнить требуемую операцию над корнем двоичного дерева(например, напечатать этот корень).
Шаг 4. Пройти Право поддерево в инфиксном порядке.
Шаг 5. Закончить работу алгоритма.
Алгоритм обхода узлов двоичного дерева в постфиксном порядке.
Шаг 1. Найти корень двоичного дерева.
Шаг 2. Пройти левое поддерево в постфиксном порядке.
Шаг 3. Пройти правое поддерево в постфиксном порядке.
Шаг 4. Выполнить требуемую операцию над корнем двоичного дерева (например, напечатать этот корень).
Шаг 5. Закончить работу алгоритма.
Private Sub click()
Dim n As Integer, i As Integer, tt As Integer, L() As Integer, R() As Integer, T() As String, S As String
S=” “:n=cells(1,4):ReDim L(n), R(n), T(n)
For i=1 To n
L(i)=cells(i,1):T(i)=cells(i,2):R(i)=cells(i,3)
Next i
Call tree_walk(1,L(),T(),R(),S)
MsgBox S, “~~~…ксный порядок~~~”
End Sub
Sub tree_walk(tt As Integer, L() As Integer, T() As String, R() As Integer, S As String)
If tt=0 Then Exit Sub ‘S=S+T(tt)+chr$(12)
Call tree_walk(L(tt), L(), T(), R(), S) ‘Левое S=S+T(tt)+chr$(13) Префиксный порядок
Call tree_walk(R(tt), L(), T(), R(), S) ‘Право S=S+T(tt)+chr$(13) Инфиксный порядок
End Sub
tt- Указатель на вершину дерева. Если дерево пусто, то tt=0 => алгоритм надо останавливать.
L()- массив с указателями на левого сына.
R()- массив с указателями на правого сына.
T()- массив для хранения самих элементов дерева
S- итоговая фраза (строковая переменная)
Найти, что выдаёт программа в инфиксном и постфиксном порядках.
Вопрос 21. Графы. Алгоритм поиска достижимых вершин графа.
Графы-способ формализовать всевозможные схемы.
Математики считают, что граф состоит из двух связанных между собой множеств. Первое-множество вершин (чаще всего изображается в виде кружочков с цифрами). Вершина: технологическая установка города на атласе автомобильных дорог, станция метрополитена и т.д.
Второе-множество дуг (чаще всего изображается в виде стрелочек).
Дуга: трубы, дороги, туннели.
Графы бывают направленные и ненаправленные. Если граф направленный, дуги обозначаются стрелочками (транспортная схема с односторонним движением).
Один из способов представления графа в памяти компьютера называется матрицей смежности.
Задача: граф задан матрицей смежности; необходимо назвать все вершины графа, в которые можно попасть по стрелочкам (дугам) из заданной вершины.
Схематичное описание алгоритма поиска достижимых вершин.
Алгоритм поиска достижимых вершин графа является рекурсивным. Схематично его можно описать как:
Шаг 1: найти все вершины непосредственно связанные со стартовой вершиной (идём по стрелочкам);
Шаг 2(рекурсивный): для каждой найденной вершины рекурсивно выполнить алгоритм поиска достижимых вершин, рассматривая уже найденную вершину как стартовую.
В процессе работы все найденные вершины нужно объединять вместе.
Примитивный алгоритм должен быть снабжён проверками, предотвращающий бесконечную рекурсию.
←Бесконечная
рекурсия.
Sub click()
Dim n As Integer, i As Integer, j As Integer, count As Integer
n=cells(2,1) ‘ n – это количество вершин (ячеек)
ReDim A(n,h) As Integer ‘ двумерный массив А
F
or
i=1 To n:for j=1 To n двойной
цикл
перебираются
строки
, столбцы
, ячейки
A(i,j)=cells(1+i,2+j)
Next j,i
i=cells(2,2):count=0 ‘ счётчик считает найденные вершины начиная с 0
call spisok(n,i,count,A()) ‘ i – стартовая величина , Call – вызов подпрограммы , А( ) –матрица смежности .
End Sub
Подпрограмма (процедура), вызывает сама себя, (рекурсивная ):
Sub spisok (n As Integer, i_start As Integer, count As Integer, A() As Integer)
Dim i As Integer, j As Integer, k As Integer ‘ дополнительные переменные
For j=1 to n
If A(i_start,j)=1 then
count=count+1’увеличивает счётчик на единицу
cells(3+count,2)=j ‘ записывает в свободную ячейку
For k=1 To n:A(k,j)=-Abs(A(k,j)):Next k ‘Отвечает за то, чтобы мы не могли попасть в найденную вершину из другой вершины
call spisok (n,j,count,A()) ‘ программа вызывает сама себя , i- стартовая величина ,не исходная ,а которую мы нашли
End If
Next j
End Sub
f
or
k=1 To n:A(k,j)=-Abs(A(k,j)):Next k
1 соответствует разорванной стрелке => больше в найденную вершину не попадём.
