Примеры рекурсивных функций
Рекурсия
End Sub
End Function
End Function
End Sub
End Sub
Randomize Timer
End Sub
End Sub
Sub ochistka()
'очистка рабочего листа от посторонних надписей
Range("A1:Z100").Clear
Sub zapolnenie(n)
Dim i As Byte, j As Byte
Dim a() As Integer
Dim max As Integer, min As Integer
ReDim a(n, n)
'Заполнение массива с использованием
'генератора случайных чисел
For i = 1 To n
For j = 1 To n
a(i, j) = 50 - Int (Rnd () * 100)
Next j
Next i
'Вызов процедуры вывода массива в рабочий лист
Cells (3, 1) = "Исходный массив:"
Call vivod(a(), n, n, 3)
'Вызов функции поиска максимума
max = maximum(a(), n)
'Вызов функции поиска минимума
min = minimum(a(), n)
'Вызов процедуры замены диагональных элементов
Call zamena(a(), n, max, min)
Sub vivod(b() As Integer, ByVal i1 As Byte, ByVal j1 As Byte, ByVal k As Byte)
'процедура вывода массива на печать в рабочий лист
Dim i As Byte, j As Byte
For i = 1 To i1
For j = 1 To j1
Cells (i + k, j) = b(i, j)
Next j
Next i
Function maximum(c() As Integer, ByVal i2 As Byte) As Integer
'функция поиска минимального элемента на диагонали матрицы
Dim i As Byte
maximum = c(1, 1)
For i = 1 To i2
If c(i, i) > maximum Then maximum = c(i, i)
|
|
Next i
Function minimum(c() As Integer, ByVal i2 As Byte) As Integer
'функция поиска минимума на диагонале в матрице
Dim i As Byte
minimum = c(1, 1)
For i = 1 To i2
If c(i, i) < minimum Then minimum = c(i, i)
Next i
Sub zamena(d() As Integer, ByVal i3 As Byte, ByVal maxm As Integer, ByVal minm As Integer)
Dim i As Byte
'процедура замены диагональных элементов
For i = 1 To i3
d(i, i) = maxm
d(i, i3 - i + 1) = minm
Next i
'замена центрального элемента на 0 при нечетном размере матрицы
If Int (i3 / 2) <> i3 / 2 Then d(Int (i3 / 2) + 1, Int (i3 / 2) + 1) = 0
' вывод на печать преобразованного массива
Cells (i3 + 5, 1) = "Пребразованный массив:"
'вызов процедуры вывода
Call vivod(d(), i3, i3, i3 + 5)
Рекурсивная (recursive) функция или процедура – это функция или процедура, которая вызывает сама себя. Почти во всех случаях, рекурсия является ошибкой программирования и приводит к полному сбою программы. Наиболее общим симптомом возникновения этой проблемы является ошибка из-за нехватки памяти или ошибка из-за нехватки памяти в стеке.
Самый простой пример, который может продемонстрировать рекурсивную функцию, это – пример функции возведения числа в степень. Алгоритм рункции Rekurs основан на том факте, что число, возведенное в степень n, равно этому же числу, умноженному само на себя в степени n -1. Например, 23 равно 2х23-1 или 2х22.
Пример 5 содержит код функции Rekurs, возвращающей степень числа. В качестве аргументов функция принимает число и степень, в которую нужно возвести это число.
Function Rekurs(num As Double, pwr As Integer) As Double
'рекурсивное возведение в степень
If pwr = 0 Then
fPower = 1 'окончание рекурсии
Else
fPower = num * fPower(num, pwr - 1) 'рекурсия
End If
End Function
Sub Test_Rekurs()
MsgBox fPower(2, 3)
End Sub
Пример 7. Чему равно F(23)&
FUNCTION F(x As Integer)As Integer
|
|
IF x <= 1 THEN
F = x
ELSEIF x MOD 2 <> 0 THEN
F= F(5 * x + 1) + 1
ELSE
F = F(x \ 6) + 1
END IF
END FUNCTION
Х = 23 F(23) = F(5 * 23 + 1) + 1 = F(116) + 1 = 5 + 1 = 6
X = 116 F(116) = F(116 \ 6) + 1 = F(19) + 1 = 4 + 1 = 5
X = 19 F(19) = F(5 * 19 + 1) + 1 = F(96) + 1 = 3 + 1 = 4
X = 96 F(96) = F(96 \ 6) + 1 = F(16) + 1 = 2 + 1 = 3
X = 16 F(16) = F(16 \ 6) + 1 = F(2) + 1 = 1 + 1 = 2
X = 2 F(2) = F(2 \ 6) + 1 = F(0) + 1 = 0 + 1 = 1
X = 0 F(0) = X = 0
Ответ: 6.