ПОНЯТНО О Visual Basic NET (том 3)




Работаем с TreeView в коде


Задача. Подсчитать, сколько человек в родословной имеют имя длиной в 4 буквы.

Задача нетривиальная. Ведь программа должна пробежаться по всем вершинам, то есть по всем коллекциям вершин. Мы с вами пробежались разик по коллекции корней в процедуре Form1_Load в предыдущем подразделе. Но как заставить программу перепрыгнуть от отца к сыну, затем к внуку и так далее на неизвестную глубину и там делать свое дело? Это вопрос. И здесь нам на выручку приходит рекурсия (15.9). Если вы не поняли, как она работает, сейчас самое время вернуться назад и разобраться, потому что иначе вы не поймете то, что написано дальше.

Программа:

Dim K As Integer = 0            'Счетчик 4-буквенных имен

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Посчитай(TreeView1)

        Debug.WriteLine(K)

End Sub

Sub Посчитай(ByVal Вершина As Object)

        Dim Дочь As TreeNode

        For Each Дочь In Вершина.Nodes

            If Len(Дочь.Text) = 4 Then K = K + 1

            Посчитай(Дочь)

        Next

End Sub

Как видите, программа получилась удивительно короткой. Такова рекурсия.

Пояснения: Если объяснять подробно, то придется давать такое же длинное ступенчатое пояснение, как для факториала. Поясню коротко. Вот процедура Посчитай «входит» в какую-нибудь очередную вершину, которая является ее параметром. Цикл

        For Each Дочь In Вершина.Nodes

заставляет ее для каждой своей дочерней вершины выполнить два оператора. Первый –

            If Len(Дочь.Text) = 4 Then K = K + 1

собственно выполняет весь подсчет, а именно, если имя дочери состоит из 4 букв, то увеличивает счетчик. Второй оператор

            Посчитай(Дочь)

и есть главный инструмент рекурсии. Он заставляет VB посчитать дочь точно так же, как только что шел подсчет для ее родителя. Там VB обнаружит внуков и так, по механизму рекурсии, обежит всех потомков вершины безо всякой головной боли с нашей стороны.

Чтобы просчитать все дерево, нам достаточно запустить процедуру Посчитай, параметром которой служила бы не вершина, а все дерево. Это мы как раз и делаем, щелчком по кнопке запуская процедуру Посчитай(TreeView1).




Содержание  Назад  Вперед