ОБЪЕКТИВНОСТЬ БЕЗ КОМПРОМИССОВОбъективность Без Компромиссов В Мире Компьютеров
НОВОСТИ САЙТАТЕСТИРУЕМ ВМЕСТЕИНТЕРНЕТ и ПОВСЯКО-РАЗНОСОФТ ПРОЕКТЫНАШИ ССЫЛКИ
ГЛАВНАЯ >> ИНТЕРНЕТ и ПО >> ПРОГРАММИРОВАНИЕ: Visual Basic 2010 - это просто. "Города РФ"

НАЗВАНИЕ СТАТЬИ: Рекурсивные процедуры в Visual Basic 2012
АВТОРСТВО: Алексей Набережный
ДАТА НАПИСАНИЯ: 21, Ноябрь 2012 года
ДАТА ПЕЧАТНОЙ ПУБЛИКАЦИИ: Online
ДАТА ПОСЛЕДНЕЙ РЕДАКЦИИ: Ноябрь 2012
Алекс Н.

В олимпиадном программировании красной нитью проходит тема рекурсии. И в каждом наборе задач на школьном, муниципальном, региональном и заключительном этапах в обязательном порядке встречаются соответствующие решения.
Неискушенные пользователи знают, что рекурсия – это процесс повторения элементов самоподобным образом, по примеру двух зеркал напротив друг друга. Разумеется, в программировании рекурсия имеет более узкое определение, когда функции вызываются из них самих же. Хотя встречается и более сложный вариант рекурсии, где рекурсивные процедуры вызываются не напрямую, а через другие функции. При этом число вложенных вызовов называется глубиной рекурсии.
Но с чего начать новичкам при более близком знакомстве с рекурсивными процедурами в рамках Visual Basic 2012? На мой взгляд, в этом разрезе стоит рассмотреть вычисление факториала исходного аргумента.

Module Module1
    Sub Main()
        Dim a As Integer
        Console.Write("Введите число: ")
        a = Console.ReadLine
        Console.Write("Факториал числа " + Str(a) + " равен ")
        Console.WriteLine(factorial(a))
        Console.ReadKey()
    End Sub
    Function factorial(ByVal n As Integer) As Integer
        If n <= 1 Then
            Return 1
        Else
            Return factorial(n - 1) * n
        End If
    End Function
End Module

Здесь рекурсивная процедура вызывает сама себя до тех пор, пока не упрется в аргумент равный единицы. Вот это условие – «If n <= 1 Then». После этого многократный самовызов с понижением значения переменной n завершается.
Конечно, такое решение не является самый эффективный способом написания кода Visual Basic и его прекрасно заместит конструкция с циклом FOR или WHILE. Однако рекурсии встречается в повседневном программировании с целях придания изящности. И далеко ходить не надо – взять хотя бы закрытые исходники антивирусной программы доктор веб.

Рекурсивная функция в Visual Studio 2012
Visual Basic 2012


Рассмотрение рекурсивных процедур

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

Использование памяти. Приложение имеет ограниченный объем пространства для локальных переменных. Каждый раз, когда процедура вызывает саму себя, она использует больше этого пространства для дополнительных копий ее локальных переменных. Если этот процесс будет продолжаться неопределенно долго, он в конечном счете вызовет ошибку StackOverflowException.

Эффективность. Почти всегда можно заменить цикл для рекурсии. Цикл не имеет дополнительных издержек аргументов передачи, инициализации дополнительного хранилища и возврат значений. Производительность может быть гораздо выше без рекурсивного вызова.

Взаимная рекурсия. Можно наблюдать очень низкую производительность или даже бесконечный цикл, если две процедуры вызывают друг друга. Такой макет представляет те же проблемы, что и одна рекурсивная процедура, но это может быть сложнее обнаружить и отладить.

Вызов со скобками. Когда процедура Function рекурсивно вызывает саму себя, после имени процедуры следует ставить скобки, даже если отсутствует список аргументов. В противном случае имя функции воспринимается как ее возвращаемое значение.

Тестирование. Если Вы пишете рекурсивную процедуру, необходимо проверить ее очень внимательно, чтобы убедиться в в том, что она всегда удовлетворяет некоторому граничному условию. Следует также убедиться в том, что в результате слишком большого количества рекурсивных вызовов вы не израсходуете всю доступную память.

>> НАВЕРХ СТРАНИЦЫ <<

Rambler's Top100 Рейтинг@Mail.ru