Задача. Подсчитать, сколько человек в родословной имеют имя длиной в 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).