Самоучитель VBA

       

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


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

В 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.

Алгоритм Евклида состоит в следующем:

  • Если а делится на b, то НОД(а, b) = b

  • В противном случае — НОД(а, b) = НОД(b, a Mod b) Приводимая ниже рекурсивная функция программирует алгоритм Евклида.

    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

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



    Содержание раздела