
- •Методические указания
- •Операционные системы пк
- •Часть 1
- •Севастополь
- •Требования к оформлению отчета к лабораторной работе
- •Введение
- •Лабораторная работа № 1 Тема: «Основы работы с ос Windows»
- •1.1 Окна ос Windows
- •1.2 Панель задач
- •1.3 Главное меню
- •1.4 Значок Мой компьютер
- •1.5 Контекстное меню
- •1.6 Создание папок и ярлыков
- •1.7 Работа с панелью управления
- •1.8 Завершение работы Windows
- •Лабораторная работа № 2 Тема: «Работа с файловой системой Windows. Стандартные программы Windows»
- •2.1 Папки, ярлыки, файлы
- •2.2 Создание объектов
- •2.3 Запуск программ
- •Лабораторная работа № 3 Тема: «Основы работы с пакетами ms Word и ms Excel»
- •3.1 Панель инструментов и режимы просмотра Microsoft Word
- •3.2 Форматирование текста в редакторе ms Word
- •3.3. Редактор формул в ms Word
- •3.3 Окна редактора, меню и панели инструментов в Excel
- •3.4 Типы данных и форматы представления в Excel
- •3.5 Основные приемы работы в ячейках Excel
- •3.6 Работа с формулами в Excel
- •3.7 Создание диаграмм средствами Excel
- •Часть I 1) Открыть новый документ ms Word
- •Часть II 1) Создать новую книгу ms Excel
- •Лабораторная работа № 4 Тема: «Системы счисления. Формы представления чисел»
- •4.1 Системы счисления
- •4.2 Правила перевода целых чисел
- •4.3 Арифметические операции
- •Лабораторная работа № 5 Тема: «Создание блок-схем алгоритмов в пакете ms Visio»
- •5.1 Основное понятие алгоритма
- •5.2 Блок-схемы алгоритма
- •5.4 Правила применения символов
- •5.4 Создание алгоритмов средствами ms Visio
- •5.5 Создание текстового документа ms Word со схемой алгоритма
- •Лабораторная работа № 6 Тема: «Исследование алгоритмов линейной структуры»
- •6.1 Виды алгоритмических структур
- •6.2 Линейный алгоритмический процесс
- •Лабораторная работа № 7 Тема: «Исследование разветвляющихся алгоритмов»
- •7.1 Разветвляющийся вычислительный процесс
- •7.2 Переключательные алгоритмические процессы
- •Лабораторная работа № 8 Тема: «Исследование алгоритмов циклической структуры»
- •8.1 Цикл с постусловием и с предусловием
- •8.2 Цикл с заданным количеством повторений
- •8.3 Алгоритмы программ с накапливанием
- •Лабораторная работа № 9 Тема: «Разработка алгоритмов, использующих структуру данных массив»
- •Лабораторная работа № 10 Тема: «Разработка алгоритмов, использующих подпрограммы»
- •Лабораторная работа № 11 Тема: «Определение функции сложности алгоритмов»
- •11.1 Функция сложности алгоритма
- •11.2 Виды функции сложности алгоритмов o(I)
- •11.3 Анализ функции сложности по программе
- •Лабораторная работа № 12 Тема: «Исследование рекурсивных и итерационных алгоритмов»
- •12.1 Рекурсия
- •12.2 Итерационные циклы
- •Лабораторная работа № 13 Тема: «Исследование основных алгоритмов сортировок»
- •13.1 Задача сортировки элементов массива
- •13.2 Линейный выбор
- •13.3 Линейный выбор с обменом
- •13.4 Стандартный обмен (метод "пузырька")
- •13.5 Челночная сортировка
- •13.6 Сортировка Шелла
- •13.7 Линейная вставка
- •3.8 Центрированная и двоичная вставки
- •13.9 Быстрая сортировка (метод Хоара)
- •Лабораторная работа № 14 Тема: «Исследование основных алгоритмов поиска»
- •14.1 Последовательный поиск
- •14.2 Бинарный (двоичный) поиск
- •14.3 Интерполяционный поиск
- •Библиографический список
Лабораторная работа № 12 Тема: «Исследование рекурсивных и итерационных алгоритмов»
Цель работы – изучить принцип построения рекурсивных и итерационных алгоритмов.
Теоретические сведения
12.1 Рекурсия
Рекурсия — это такой способ организации вспомогательного алгоритма (подпрограммы), при котором эта подпрограмма (процедура или функция) в ходе выполнения ее операторов обращается сама к себе. Вообще, рекурсивным называется любой объект, который частично определяется через самого себя. Если подпрограмма Р вызывает себя в своем теле, то такая рекурсия называется прямой, если же подпрограмма Р вызывает подпрограмму Q, которая прямо или косвенно вызывает Р, то такая рекурсия называется косвенной. Рекурсией также называют процесс выполнения рекурсивной подпрограммы.
Классическим примером рекурсивной функции является функция вычисления факториала. Для того чтобы получить значение факториала числа n, требуется умножить на n факториал числа (n – 1).
На рис.12.1 показана блок схема алгоритма подпрограммы, которая производит рекурсивное зацикливание: будет выводиться значение «1», после чего подпрограмма снова будет вызывать себя и т.д. до бесконечности. Поскольку при каждом вызове подпрограммы в программный стек помещается ее запись активации, то, в конце концов, программный стек переполнится, и программа завершится с ошибкой. Таким образом, чтобы рекурсия завершалась, необходимо, чтобы рекурсивный вызов происходил не всегда, а лишь при выполнении некоторого условия.
Рисунок 12.1 – Пример подпрограммы с рекурсивным зацикливанием
Рассмотрим рекурсивные подпрограммы рис.12.2.
а) б)
Рисунок 12.2 – Примеры подпрограмм с применением рекурсии
При вызове процедуры p(5) рис.12.2а выводится значение «5», вызывается процедура p(4); затем выводится «4» и вызовется p(3) и т.д. до вызова p(0), когда выводится «0» и, поскольку условие n>0 станет ложным, рекурсия завершится. Итак, в результате вызова p(5) на экран будет выведено «5 4 3 2 1 0».
При вызове подпрограммы p(5) рис.12.2б вначале проверится условие n>0 и, поскольку оно истинно, вызовется p(4), затем p(3) и т.д. до p(0). Так как при вызове p(0) условие n>0 уже не выполняется, то осуществится вывод 0 и произойдет выход из вызова p(0) в вызов p(1) сразу после условного оператора. Далее осуществится вывод «1» и выход из вызова p(1). В результате на экран будет выведено «0 1 2 3 4 5». Процесс возврата из уже сделанных рекурсивных вызовов продолжится, пока не будет осуществлен выход из вызова p(5).
Схема рекурсивных вызовов подпрограмм на рис.12.2 изображена на рис.12.3:
Рисунок 12.3 – Схема рекурсивных вызовов спуска и возврата
Процесс рекурсивных вызовов называется рекурсивным спуском, а процесс возврата из них – рекурсивным возвратом. Глубиной рекурсии называется максимальное число вложенных рекурсивных вызовов (в нашем примере глубина рекурсии равна 5). Число вложенных рекурсивных вызовов в данный момент выполнения программы называется текущим уровнем рекурсии.
Несколько замечаний, относительно целесообразности применения рекурсивных подпрограмм:
Рекурсивные алгоритмы являются эффективным средством программирования для некоторого класса задач: сложные задачи численного анализа, комбинаторики, алгоритмов трансляции, операций над списковыми структурами и т. д. Программы в этом случае имеют небольшие объемы по сравнению с итерацией и требуют меньше времени на отладку.
При каждом рекурсивном вызове на программный стек помещается запись активации подпрограммы. Поэтому если количество рекурсивных вызовов большое или локальные переменные рекурсивной процедуры имеют большой размер, то программный стек может переполниться и возникнет ошибка времени выполнения программы.
Накладные расходы на рекурсивные вызовы достаточно велики, поэтому если есть явное нерекурсивное решение, то следует предпочесть его.
Можно доказать, что любая прямая рекурсия может быть заменена итерацией.