Рекурсивные процедуры
Рекурсивные процедуры
В VBA возможно создание рекурсивных процедур, т. е. процедур, вызывающих самих себя. Стандартным примером рекурсивной процедуры является процедура вычисления факториала, т. е. функции, возвращающей результат произведения первых п натуральных чисел, где п — аргумент функции. Для этой функции имеется стандартное обозначение:
Fact(n) =n!, где Fact (0) =1.
Ясно, что
Fact(n) = n Fact (n - 1}
Основываясь на данном соотношении, приводимая ниже рекурсивная функция вычисляет значение факториала.
Function Fact(n As Integer) As Integer
If n<l Then
Fact = 1 Else
Fact = Fact(n - 1) n
End If
End Function
Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (нод) двух целых чисел — это наибольшее целое, на которое делятся оба числа. Например, HOД(10, 14} = 2 и НОД (15, 31} = 1.
Алгоритм Евклида состоит в следующем:
Function НОД(Целое1 As Long, Целое2 As Long) As Long
If Целое2 Mod Целое1 = 0 Then
НОД = Целое1 Else
НОД = НОД(Целое2, Целое1 Mod Целое2)
End If
End Function
Несмотря на элегантность рекурсивных процедур, применять их надо с осторожностью, т. к. неаккуратное использование может привести к проблемам с памятью — многократный вызов такой процедуры быстро исчерпывает стековую память.