АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Рекурсия

Читайте также:
  1. Артикуляционный аспект изучения звуков речи. Речевой аппарат, его части. Устройство и роль нижней части речевого аппарата.
  2. Введение
  3. Встроенные языки программирования
  4. Кратность ассоциации
  5. Оператор1, оператор2, ... , операторN
  6. Рекурсивные функции
  7. Частное учреждение образования

Под рекурсией понимают способность программы вызывать саму себя. Процедуры выделяют для хранения переменных ограниченный объем памяти в стеке. Стек - это рабочая область памяти, которая заполняется и освобождается динамически в соответствии с потребностями выполняемой программы. При каждом вызове процедурой самой себя выделяется дополнительный объем этой памяти. Процедура, вызывающая сама себя, называется рекурсивной. Рекурсивная процедура, которая бесконечно вызывает саму себя, приводит к ошибке. Например:

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;

- переосмысления логики процедуры. Часто вместо рекурсии можно воспользоваться вложенными циклами.

Создание пользовательской функции на VBA в среде EXCEL. необходимо сначала использовать команду меню Вид/Макрос/Макросы, а для вставки функций применяется команда меню Вставка/Функция или кнопка стандартной панели инструментов Вставка функции. При вставке функции запускается мастер функций, и если в проекте VBA имеется хотя бы одна функция, то в правом окне мастера функций появляется категория Определенные пользователем. При выборе этой категории в левом окне мастера функций отображается перечень функций проекта VBA. После выбора необходимой функции из списка, мастер функций предлагает ввести ее параметры, количество которых определено в ее заголовке. Если функция имеет необязательные параметры, или их число не определено, то мастер функций будет открывать окна для их ввода последовательно, по мере заполнения ранее открытых, как это происходит, например, при вставке функции рабочего листа СУММ. Значения параметров можно ввести с клавиатуры, либо можно ввести адрес ячейки, содержащей значение, либо можно указать ячейку с параметром, щелкнув по ней правой кнопкой мыши. Заметим, что ввод в качестве параметра диапазона ячеек допустим лишь в том случае, когда функция имеет неопределенное количество параметров, либо вводимый параметр представляет собой массив, либо он имеет объектовый тип данных Range.

В качестве примера перепишем в виде функции процедуру замены букв "А", "Б", "В" на цифры 1, 2, 3 соответственно (пример):

Function пример11(s As String)

Dim sn As String, t As String

Dim l As Integer, i As Integer

l = Len(s)

For i = 1 To l

t = Mid(s, i, 1)

Select Case t

Case "А": sn = sn + "1"

Case "Б": sn = sn + "2"

Case "В": sn = sn + "3"

Case Else: sn = sn + t

End Select

Next i

пример11 = sn

End Function

Отметим, что поскольку функция не может быть выполнена непосредственно, а должна быть вызвана, то для ее отладки (например, в пошаговом режиме) необходимо написать процедуру, обеспечивающую ввод параметров функции, ее вызов и вывод результата работы функции. Если функция возвращает более одного значения (используя список формальных параметров), то эти значения не могут быть выведены на рабочий лист с помощью мастера функций.

Пример: Функции пользователя

Создать функцию для вычисления в EXCEL

1. Insert / Module – добавление в проект модуля,

2. щелчок на пиктограмме Module 1,

3. в окне свойств (Properties), Names (имя), ввести Vector (имя модуля),

4. в окне VBA ввести операторы функции:

Public Function getVector(a As Single, b As Single) As Single
Dim z As Single
z = Sqr(a ^ 2 + b ^ 2)
getVector = z
End Function

(Function – имя процедуры, Public – глобальный доступ)

4. Сохранить результаты, закрыть окно VBA.

5. Найти созданную функцию в EXCEL– fx, выбрать категорию

«Определенные пользователем», ввести значения аргументов.

 

Пример. Вычисление квадратного корня, объект Range (рис. 36.).

Рис. 36. Результат программы вычисления

формулы

 

Задание 1. Функции пользователя

 

1. Создать пользовательские функции,

2. Рассчитать значения x при a = 0,1 ± 0,1 в диапазоне от 0,1 до 3, b = 2

3. Построить графики функции x(a) (рис. 37.).

 
 


Formula1

 

Formula2

 

Formula3

 

Formula4

Рис. 37. Результат программы создания пользовательской функции.

Контрольные вопросы

1. Что такое подпрограммы-процедуры и их описание в VBA?

2. Что такое подпрограммы-функции и их описание в VBA?

3. Что такое рекурсия?

4. Как происходит передача параметров по ссылке и по значению?

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)