
- •1. Условный оператор, оператор выбора
- •5. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов.
- •2. Операторы организации циклов
- •3. Обработка двумерных массивов.
- •4. Процедуры и функции
- •37. Алгоритмы генерирования k-элементных подмножеств множества
- •6. Использование множеств для решения задач
- •7. Процедуры и функции обработки строк
- •8. Сортировка и поиск информации. Методы внутренней сортировки: Сортировка «пузырек»
- •9.Сортировка подсчетом.
- •10.Сортировка простым обменом
- •11. Методы внутренней сортировки: «Шейкер-сортировка»
- •12. Методы внутренней сортировки: Сортировка «Хаора»
- •14. Методы внутренней сортировки: Пирамидальная сортировка
- •16.Сортировка бинарными вставками
- •17. Методы внутренней сортировки: Сортировка «Шелла»
- •15 Сортировка простыми вставками.
- •19.Чтение типизированных файлов
- •18. Сортировка слиянием
- •20.Алгоритмы удаления записей типизированного файла.
- •19.Сортировка естественным слиянием.
- •28. Динамическая структура очередь, ее создание и использование.
- •20. Поразрядная сортировка
- •32. Деревья: построение бинарного дерева
- •52.Чтение типизированных файлов
- •21. Рекуррентные выражения. Рекурсия: прямая и косвенная.
- •22.Стандартные процедуры и функции Unit Graph.
- •53.Алгоритмы удаления записей типизированного файла.
- •27. Динамическая структура стек, ее создание и использование.
- •34. Алгоритмы генерирования перестановок (антилексикографическом порядке )
- •29. Списки: односвязные
- •33. Алгоритм генерирования перестановок в лексикографическом порядке.
- •30.Списки: двухсвязные
- •31. Динамическая структура кольцо, ее создание и использование.
- •34. Алгоритмы генерирования перестановок
- •51. Создание типизированных файлов.
- •36. Алгоритмы генерирования множества всех подмножеств
- •65. Создание таблиц базы данных с помощью Database Desktop.
- •38. Введение в теорию графов. Способы представления ориентированных и неориентированных графов: матрицы смежности
- •39. Поиск в ширину в графе
- •40. Поиск в глубину в графе
- •41,42. Построение остовного дерева графа.
- •43. Поиск кратчайшего пути в графе (Алгоритм Дейкстры)
- •44.Алгоритм Форда поиска кратчайших расстояний в графе.
- •45.Алгоритм Флойда поиска кратчайших расстояний в графе.
- •46. Алгоритмы с возвращением, их реализация с помощью рекурсий и динамических структур. Примеры алгоритмов с возвращением.
- •50.Типизированные файлы, их назначение и использование. Основные процедуры обработки типизированных файлов
- •47,48. Типы файлов, объявление, логическая и физическая организация файловой системы, процедуры и функции обработки файлов
- •67,68 Компоненты страниц Data Access, Data Controls. Создание базы данных, псевдонима бд
- •62 Компоненты страницы Samples, их назначение, свойства, примеры применения
- •56.Полиморфизм. Виртуальные методы. Таблица виртуальных методов
- •54.Понятие объекта.(класса). Инкапсуляция. Иерархия классов (типов). Правила наследования
- •57. Компоненты страницы Standard, их назначение, свойства, примеры применения.
- •49. Нетипизированные файлы
- •58.Компоненты страницы Additional, их назначение, свойства, примеры применения
- •1. TBitBtn
- •2. TSpeedButton
- •3. TMaskEdit
- •4. TDrawGrid
- •60. Компоненты страницы System, их назначение, свойства, примеры применения
- •71. Создание справочной системы
- •61,. Компоненты страницы Dialogs их назначение, свойства, примеры применения
- •63. Задание и изменение свойств компонентов с помощью Инспектора объектов и программно
- •64. Обработка событий, связанных с использованием компонентов.
- •70. Мультимедийные возможности Delphi
- •66. Создание и использование модуля данных Data Module.
- •69. Графические возможности Delphi
21. Рекуррентные выражения. Рекурсия: прямая и косвенная.
Объект называется рекурсивным, если он содержит сам себя или определен с помощью самого себя.
С понятием рекурсии мы уже встречались при рассмотрении алгоритма Хоара. Вообще это понятие относится не только к алгоритмам. В жизни возникают рекурсивные изображения (в зеркале, на телеэкране). При описании синтаксиса какого-либо языка часто используются металингвистические формулы (Бэкуса нормальные формы), например:
<цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |,
<буква> ::= A| B | …| Z,
<целое число без знака> ::= <цифра> | <целая часть><цифра>,
<идентификатор>::=<буква>|<идентификатор><буква> | <идентификатор><цифра>.
Две последние формулы рекурсивны.
Рекурсивным может быть и определение функции. Так, например, факториал: f(n) = n! Одним из способов определения такой функции является рекурсивный способ:
1 при n=0,
n! = {
n*(n-1)! при n>0.
Достоинства и недостатки рекурсивных программ.
Любое рекурсивное определение функции можно заменить нерекурсивным. Точно также и любой рекурсивный алгоритм можно заменить нерекурсивным. Так для вычисления n! нерекурсивная функция будет описана следующим образом:
FUNCTION FACT (N: INTEGER): INTEGER;
VAR K,I: INTEGER;
BEGIN
K:=1;
FOR I:=1 TO N DO K:=K*I;
FACT:=K;
END;
Рекурсивность – это не свойство функции, а свойство ее описания. Какое же из описаний лучше?
В общем случае рекурсивное описание короче и нагляднее, но требует больших затрат машинного времени (за счет повторных обращений к процедуре) и большей памяти (за счет дублирования локализованных в процедуре переменных). Чему отдать предпочтение – следует решать в конкретном случае.
Каждый рекурсивный алгоритм нужно оценивать с точки зрения времени работы. Если сам алгоритм даже при нерекурсивном описании содержит много действий, то в нем относительное увеличение времени за счет рекурсии будет небольшим.
Если в алгоритме мало действий, то доля дополнительных команд может оказаться слишком большой. Например, в алгоритме для n! рекурсивная процедура гораздо медленнее, поэтому целесообразнее использовать его нерекурсивную форму, а именно – итеративную (рекуррентную).
Поэтому вывод можно сделать следующий. Если задача имеет очевидное итеративное решение, то рекурсии следует избегать. Однако это не значит, что от рекурсии нужно избавляться всегда и любой ценой. Для алгоритма Хоара, например, потери во времени на практике являются небольшими. Многие сложные алгоритмы описываются в рекурсивной форме более наглядно, поэтому целесообразно их описывать именно так.
Примеры рекурсивных процедур и функций.
Язык Паскаль позволяет создавать процедуры и функции, обладающие свойством рекурсивности, то есть содержащие в своем описании вызов самих себя. Так для вычисления n! мы можем составить такое рекурсивное описание функции.
Пример 1.
FUNCTION FACT (N: INTEGER): INTEGER;
BEGIN
IF N=0
THEN FACT:=1
ELSE FACT:=N*FACT(N-1)
END;
Пример 2.Выдать на печать в обратном порядке цифры целого положительного числа N.
PROCEDURE REVERSE (N: INTEGER);
BEGIN
WRITE (N MOD 10);
IF (N DIV 10)> 0
THEN REVERSE (N DIV 10)
END;