- •1. Абстрагирование типов
- •1.1. Понятие типа данных
- •1.1.1. Простые типы
- •1.1.2. Абстрактные типы
- •2. Идентификация объектов
- •2.1. Именование
- •2.2. Указание
- •2.2.1. Организация адресного пространства оперативной
- •2.2.2. Понятие указателя
- •2.2.3. Действия над указателями
- •2.2.4. Связывание идентификатора объекта с его
- •3. Время жизни объекта. Классы памяти
- •3.1. Понятие “времени жизни” объекта
- •3.2. Классы памяти
- •3.2.1. Статическая память
- •3.2.2. Автоматическая память
- •3.2.3. Динамическая память
- •4. Динамические структуры данных
- •4.1. Метод вычисляемого и хранимого адреса.
- •4.2. Понятие динамической структуры данных
- •4.3. Линейные динамические структуры данных (списки)
- •4.3.1. Основные виды списков
- •4.4. Односвязные списки
- •4.4.1. Включение узла в начало списка
- •4.4.2. Создание списка из n узлов за счет добавления
- •4.4.3. Создание списка из n узлов за счет добавления
- •4.4.4. Исключение узла из начала списка
- •4.4.5. Перестановка указателя
- •4.4.6. Поиск в списке узла по заданному условию
- •4.4.7. Включение нового узла в список за тем узлом, на
- •4.4.8. Исключение из списка узла за тем узлом, на
- •4.4.9. Исключение из списка узла, на который предварительно
- •4.4.10. Разрушение списка
- •4.4.11. Программный модуль, реализующий операции
- •4.5. Односвязные циклические списки
- •4.6. Двусвязные списки
- •4.6.1. Включение нового узла в список за тем узлом, на
- •4.6.2. Исключение из списка узла, на который
- •4.7. Ортогональные списки (мультисписки)
- •4.8. Разнородные списки
- •4.9. Управление динамической памятью
- •4.9.1. Администратор кучи
- •4.9.2. Алгоритмы выделения участков памяти по запросу
- •4.9.3. Фрагментация
- •4.9.4. Накопление мусора
- •4.9.5. Висящие ссылки
- •5. Множественная интерпретация объектов
- •5.1. Совместимость типов. Приведение и преобразование типов
- •5.2. Методы совмещения типов
- •5.2.1. Запись с вариантной частью
- •5.2.2. Использование директивы absolute
- •5.2.3. Параметры без типа
- •5.2.4. Открытые массивы
- •5.2.5. Наложение масок с помощью указателей
- •6. Рекурсивные структуры данных
- •6.1. Итерация и рекурсия в программировании
- •6.1.1. Понятие рекурсии
- •6.1.2. Итеративная и рекурсивная схема организации
- •6.2. Задача о “ханойских башнях”
- •6.3. Виды рекурсивных структур данных
- •6.3.1. Арифметические выражения
- •6.3.2. Динамические линейные структуры данных: списки
- •6.3.3. Иерархические линейные структуры данных: наборы
- •6.4. Эффективность рекурсивных вычислений
- •7. ИерархическиеНелинейные структуры данных.Деревья
- •7.1. Деревья общего вида
- •7.2. Бинарные деревья
- •7.3. Представление бинарных деревьев
- •7.3.1. Представление бинарных деревьев на статической
- •7.3.2. Представление бинарных деревьев на
- •7.4. Алгоритмы обхода бинарных деревьев
- •7.5. Виды бинарных деревьев
- •7.5.1. Сбалансированные деревья
- •7.5.2. Дихотомические деревья (деревья поиска)
- •7.5.3. Деревья выражений
- •7.6. Программный модуль, реализующий операции
- •Список рекомендуемой литературы
6. Рекурсивные структуры данных
6.1. Итерация и рекурсия в программировании
6.1.1. Понятие рекурсии
Рекурсия– есть метод определения множества объектов или процесса в терминах самого себя.
Рекурсивные определения
Любое рекурсивное определение содержит две части: базисную частьи собственнорекурсивную.
Определим понятие нечетного целого числа следующим образом.
базисная часть: число 1 является нечетным целым числом;
рекурсивная часть: если какое либо число К является нечетным целым числом, то нечетными целыми будут числа, определяемые выражениями К-2 и К+2.
Это определение состоит из двух независимых частей: базисной (или базы) и рекурсивной. Базисная часть является нерекурсивным утверждением, которое задает определение для некоторой фиксированной группы объектов. Рекурсивная часть определения записывается таким образом, чтобы при цепочке повторных применений утверждение из рекурсивной части приводилось бы к базисной части. Таким образом, базисная часть задает один или более случаев, которые удовлетворяют определению, а рекурсивная часть показывает, как применить определение, чтобы проверить, удовлетворяют ли ему другие случаи.
Например, докажем, что число К = 7 является нечетным целым числом. Для этого применим рекурсивную часть определения:
число К = 7 является нечетным целым числом, если нечетным целым является число К - 2 = 7 - 2 = 5;
число К = 5 является нечетным целым числом, если нечетным целым является число К - 2 = 5 - 2 = 3;
число К = 3 является нечетным целым числом, если нечетным целым является число К - 2 = 3 - 2 = 1;
Число К = 1 является нечетным целым числом. Таким образом, рекурсивное утверждение удалось привести к базе, следовательно, первоначальное утверждение о том, что число К = 7 - нечетное целое число является истинным.
Рекурсивные алгоритмы
Рекурсивный алгоритм реализует какое-либо рекурсивное определение посредством разбиения решаемой задачи на подзадачи меньшей размерности, выполняемые с помощью одного и того же алгоритма. Процесс разбиения завершается при достижении простейших возможных решаемых задач, которые называются условиями завершения. Таким образом, рекурсивное определение алгоритма включает две части:
условия завершения (одно или несколько), которые могут быть вычислены для определенных параметров. Условия завершения соответствуют базисной части рекурсивного определения;
шаг рекурсии, в котором текущиезначениянекоторых переменных в алгоритме могут быть определеныв терминахих предыдущихзначений. В конечном итоге шаг рекурсии должен приводить квыполнению условийзавершения.
Рекурсивные алгоритмы реализуются через рекурсивные процедуры (функции). Рекурсивной называется процедура, которая в процессе выполнения явно или неявно вызывает сама себя.Прямая (явная) рекурсияхарактеризуется наличием в теле процедуры оператора обращения к ней же самой (рис.54.а). В случаекосвенной (неявной) рекурсииодна процедура обращается к другой, которая (возможно через цепочку вызовов других процедур) вновь обращается к первой (рис.54.б). Далее будем рассматривать только прямую рекурсию.
а. Прямая рекурсия б. Косвенная рекурсия
Рис. 54. Схема прямой и косвенной рекурсии