Поделиться через


Рекурсивные процедуры

Обновлен: Ноябрь 2007

Рекурсивная процедура — это процедура, которая вызывает сама себя. Как правило, это не самый эффективный способ написания кода Visual Basic.

Приведенная ниже процедура использует рекурсию для вычисления факториала исходного аргумента:

Function factorial(ByVal n As Integer) As Integer
    If n <= 1 Then
        Return 1
    Else
        Return factorial(n - 1) * n
    End If
End Function

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

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

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

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

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

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

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

См. также

Задачи

Устранение неполадок в процедурах

Разрешение вопросов, связанных с исключениями: System.StackOverflowException

Основные понятия

Процедуры в Visual Basic

Процедуры Sub

Процедуры Function

Процедуры свойств

Процедуры операторов

Параметры и аргументы процедуры

Перегрузка процедур

Циклические структуры

Ссылки

StackOverflowException