Рекурсивные процедуры (Visual Basic)
Рекурсивная процедура — это процедура, которая вызывает себя. Как правило, это не самый эффективный способ написания кода Visual Basic.
Следующая процедура использует рекурсию для вычисления факториала исходного аргумента.
Function Factorial(n As Integer) As Integer
If n <= 1 Then
Return 1
End If
Return Factorial(n - 1) * n
End Function
Рекомендации по рекурсивным процедурам
Ограничения условий. Необходимо разработать рекурсивную процедуру, чтобы проверить по крайней мере одно условие, которое может завершить рекурсию, и необходимо также обработать ситуацию, когда такое условие не удовлетворяется в разумном количестве рекурсивных вызовов. Без хотя бы одного условия, которое может быть выполнено без сбоя, процедура выполняет высокий риск выполнения в бесконечном цикле.
Использование памяти. Приложение имеет ограниченное пространство для локальных переменных. Каждый раз, когда вызывается процедура, она использует больше этого пространства для дополнительных копий своих локальных переменных. Если этот процесс продолжается бесконечно, это в конечном итоге приводит к ошибке StackOverflowException .
Эффективность. Вы почти всегда можете использовать цикл вместо рекурсии. Цикл не имеет затрат на передачу аргументов, инициализацию дополнительного хранилища и возврат значений. Производительность может быть гораздо лучше без рекурсивных вызовов.
Взаимная рекурсия. Вы можете наблюдать очень низкую производительность или даже бесконечный цикл, если две процедуры вызывают друг друга. Такая конструкция представляет те же проблемы, что и одна рекурсивная процедура, но может быть труднее обнаруживать и отлаживать.
Вызов с круглыми скобками. Function
Когда процедура вызывает себя рекурсивно, необходимо следовать имени процедуры с скобками, даже если нет списка аргументов. В противном случае имя функции принимается как представляющее возвращаемое значение функции.
Тестирование. Если вы напишете рекурсивную процедуру, необходимо тщательно проверить ее, чтобы убедиться, что она всегда соответствует некоторому ограничению условия. Кроме того, следует убедиться, что не удается запустить память из-за слишком большого количества рекурсивных вызовов.