Создание рекурсивных процедурCreating recursive procedures

В процедурах ограниченно количество места для переменных.Procedures have a limited amount of space for variables. Чем больше раз вызывается процедура, тем больше места используется.Each time a procedure calls itself, more of that space is used. Процедура, вызывающая себя, называется рекурсивной.A procedure that calls itself is a recursive procedure. Неограниченная рекурсия может вызывать ошибку.A recursive procedure that continuously calls itself eventually causes an error. Например:For example:

Function RunOut(Maximum) 
 RunOut = RunOut(Maximum) 
End Function

Эта ошибка может быть менее явной, если процедуры вызывают друг друга бесконечное число раз или если не выполняется условие, ограничивающее рекурсию.This error may be less obvious when two procedures call each other indefinitely, or when some condition that limits the recursion is never met. У рекурсии есть свое назначение.Recursion does have its uses. Например, следующая процедура использует рекурсивную функцию для вычисления факториалов.For example, the following procedure uses a recursive function to calculate factorials.

Function Factorial (N) 
 If N <= 1 Then ' Reached end of recursive calls. 
 Factorial = 1 ' (N = 0) so climb back out of calls. 
 Else ' Call Factorial again if N > 0. 
 Factorial = Factorial(N - 1) * N 
 End If 
End Function

Нужно проверить, не использована ли рекурсия столько раз, что это повлечет за собой загрузку всей памяти.You should test your recursive procedure to make sure it does not call itself so many times that you run out of memory. Если возникла ошибка, проверьте, не идет ли вызов рекурсии бесконечное количество раз.If you get an error, make sure your procedure is not calling itself indefinitely. После этого попробуйте сохранить память, выполнив следующее:After that, try to conserve memory by:

  • Устраните ненужные переменные.Eliminating unnecessary variables.
  • Используйте типы данных, отличные от Variant.Using data types other than Variant.
  • Измените структуру процедуры.Re-evaluating the logic of the procedure. Часто можно подставить вложенные циклы.You can often substitute nested loops for recursion.

См. такжеSee also

Поддержка и обратная связьSupport and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.