Создание рекурсивных процедур
Процедуры
выделяют для хранения переменных ограниченный объем памяти. При каждом вызове процедурой самой себя выделяется дополнительный объем этой памяти. Процедура, вызывающая сама себя, называется рекурсивной. Рекурсивная процедура, которая бесконечно вызывает саму себя, приводит к ошибке. Например:
Function RunOut(Maximum)
RunOut = RunOut(Maximum)
End Function
Эта ошибка менее очевидна, если две процедуры бесконечное число раз вызывают друг друга, или некоторое условие, ограничивающее рекурсию, никогда не выполняется. Рекурсия имеет свои области применения. Например, следующая процедура использует рекурсию для вычисления факториалов:
Function Factorial (N)
If N <= 1 Then' Достигнут конец рекурсивных вызовов.
Factorial = 1' (N = 0) завершение вызовов.
Else' Повторный вызов функции, если N > 0.
Factorial = Factorial(N - 1) * N
End If
End Function
Необходимо проверить, что рекурсивная функция не вызывает себя столько раз, что начинает сказываться нехватка памяти. При возникновении ошибки, убедитесь, что процедура не вызывает себя бесконечное число раз. После этого попробуйте сэкономить память с помощью:
устранения ненужных переменных;
использования типов данных , отличных от Variant;
переосмысления логики процедуры. Часто вместо рекурсии можно воспользоваться вложенными циклами.