Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAP(теория).doc
Скачиваний:
49
Добавлен:
15.02.2016
Размер:
687.62 Кб
Скачать

27. Использование компоненты TeeView для построения деревьев.

Сложные структуры данных в Windows обычно представляются двумя способами: в виде только что рассмотренного списка и в виде дерева. Так, например, отображается структура каталогов в Проводнике: слева иерархическая структура диска в виде раскрывающихся значков с обозначениями «-» (развернут) и «+» (свернут), а справа — содержимое выбранного каталога в виде списка. Для создания подобных деревьев, отображающих иерархические структуры дан¬ных, в системе Delphi 7 реализован компонент TTreeView. Процесс создания дерева достаточно прост. Его начальную структуру можно сформи-ровать в редакторе, аналогичном редактору компонента TListView, только уровень вложенности элементов в таком списке не ограничен. У компонента TListView под-держивался только один уровень вложенности по схеме «объект — набор свойств». Каждому узлу дерева может соответствовать своя картинка. Ее номер указывается в поле редактора Image Index (Номер картинки), а сам список картинок задается в свойстве Images. Дополнительно, для каждого узла можно указать номер картинки, отражающей его выделенное состояние (свойство Selected Index), и номер картинки, отражающей его дополнительное состояние (свойство State Index). Имена узлов можно редактировать, как обычные названия объектов Windows. Многие свойства дерева совпадают со свойствами объекта TListView, но есть и небольшие отличия, вызванные необходимостью отображать неограниченные иерархии объектов и только одним режимом работы. Основные свойства компонента TTreeView приведены в табл. 4.78. Сами узлы хранятся в свойстве Items (класс TTreeNodes) и имеют тип TTreeNode. Класс TTreeNodes содержит свойство Item — массив объектов типа TTreeNode. Основные свойства класса TTreeNode приведены в табл. 4.79.

28. Рекурсия. Рекурсивные функции и процедуры. Рекурсия в программировании Функции

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.

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

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

Впрочем, имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторыфункциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивается выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. Однако, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Scheme (диалект языка Lisp), описание которого содержит все необходимые сведения.

Любую рекурсивную функцию можно заменить циклом и стеком.

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

struct element_of_list

{

element_of_list *next; /* ссылка на следующий элемент того же типа */

int data; /* некие данные */

};

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]