Сегодня я хотел чуть чуть разбавить наши хитости теорией. Не совсем
сухой терией, а теорией с примерами. Давайте начнем с простейшей манипуляции
функциями, знать о которой должен любой программист. Называется эта
манипуляция рекурсией, и подразумевает ситуацию, когда функция
вызывает сама себя.
Люди не отягошенные написанием алгоритмов согут воскликнуть - И зачем
нам это все сдалось .... Только голову морочить. Я на это могу рассказать
вам анекдот про математика, которого спросили про алгоритм изготовления
чая. "Взять чайник, налить вожы, поставить на огонь, после закипания
заварить чай." Ответил он. А тогда расскажите нам алгоритм приготовления
чая если в чайнике уже есть вода. "Вылить воду - после этого задача
сводится к предыдущей"
Именно так и стоит поступать часто. Зависит, правда от того, сколько
"воды" выливать. Простейший пример, где рекурсия вполне уместна
- реализация вычисления факториала числа. (надеюсь вы еще помните этот
термин со школы? )
Итак , n! = 1 * 2 * 3 * .... * n
Как можно реализовать это программно -
делаем функцию, которая возвращает искомое число
Function Factorial(N as long ) as long
If n > 1 Then
'Проверяем не дошли ли мы до конца нашей рекурсии
Factorial = n * Factorial(n - 1)
Else
'Последний элемент рекурси
Factorial = n
End If
End function
Какие плюсы предоставляет такой метод вычислений?
Во первых он безразличен к количеству элементов. Во вторых компактен
и упрощает код.
Какие слжности могу ждать вас на этом пути: Главное - рекурсия должна
сходится. Это значит, что число последовательных вызовов функцией самой
себя не может быть бесконечным. Каждый вызов помещает информацию об
адресе точки вызова в стек, на VB мы этого не видим, и повлиять на это
никак не можем. При этом размер стека большей но не бесконечный. Т.е.
если вы получаете сообщение stack overflow ( переполнение стека) - проверьте
алгоритм.
Так как этот пример мне задавали на днях - давате рассмотрим приложение
выводящее текст в лэйбл . при этом текст должен быть разбит на строки
не как попало, а по пробелам. Количество символов в строке может быть
разным, но не должно превышать заданного числа
'итак, вызываем нашу функцию
Label1.Caption = SplitString("12 34 567 890 12 123 1234 ", 6)
Function SplitString(s As String, nSplit As Integer) As String
'nsplit - максимальное количество символов в строке
Dim tmp As String
Dim tmp1 As String
Dim pos As Integer
pos = InStrRev(s, " ", nSplit + 1)
If pos = 0 Then
'в строке только одно слово
'поместить код для разбивки по гласным
'для переноса
Else
tmp = Left(s, pos)
tmp1 = Mid(s, pos + 1, Len(s) - pos)
If Len(tmp1) = Len(tmp) Then
SplitString = tmp & vbCrLf & tmp1
Else
SplitString = tmp & vbCrLf & SplitString(tmp1, nSplit)
End If
End If
Домашнее задание. Доработайте ту часть, котрая заведует переносами строк
слово в котром длиннее чем целая строка. Подсказка - переносы производятся
после гласной, а гласных в русском алфавиет немного . Думаю это должно
быть оформлено в виде отдельной функции.
Традиционная рекомендация из серии "куда
пойти учиться" - по мнению читателей (а читатели выражают свое
мнение не только письмами, но и покупками, статистика
которых вполне доступна) лучший
печатный учебник по VB . Отзывы читателей об этой книге можно посмотреть
у меня на сайте - здесь
Рассылка, которая вам может пригодится:
"СообЧа (СООБщество ЧАйников). Обмен опытом, вопросы, ответы."
Программистам - начинающим, опытным, маститым профессионалам и непрофессионалам.
Всем, кого не коробит слово "ЧАЙНИК". Не тот программист, кто диплом имеет,
а тот, у кого голова в мониторе, локти сшибают кофе на пол, а уши совершенно
не слышат ни давно охрипший свисток чайника, ни призывное воркование жены.
Цель этой рассылки: объединение увлеченных людей, которые сами себе создают
проблемы и потом в отчаянии рвут последние волосы с лысеющей головы. Или
не с лысеющей... И не последние... И не рвут, а пляшут, потому что проблема,
над которой бился полмесяца (надо же! Вроде всего пара дней.) теперь,
наконец, решена. А в сущности, возможно, проблема уже давно кем-нибудь
решена, и причитающиеся ей волосы давно выдраны. Пишите сюда, просите
помощи и получайте готовое решение! Но не забывайте, что за все надо платить.
Ваша плата - доброжелательность, отзывчивость и готовность помочь. Решайте
проблемы СообЧа! И если Вы подписались на эту рассылку - Вы уже член нашего
СООБщества ЧАйников, более ничего не требуется. (А вот к "суперпрограммистам",
презрительно надувающим щеки при слове "ЧАЙНИК", огромная просьба не беспокоиться
с подпиской.) Автор рассылки - тоже "ЧАЙНИК", хотя и смеет надеяться на
то, что со свистком. А потому прочь стеснительность и другие комплексы,
задавайте друг другу пусть самые, казалось бы, идиотские вопросы, получайте
на них ответы и решения. Знакомьтесь, обменивайтесь опытом, текстами программ...
В планах - создание совместного сайта на конкурсной основе.