САОД. Лабораторная работа №2. Лабораторная работа 2 1
![]()
|
САОД Лабораторная работа № 2 1 Лабораторная работа № 2 Рекурсия Цель работы: изучение рекурсии. Общие сведения В математике строгое определение некоторых понятий может опираться на то же понятие. Такие определения называют рекурсивными (или индуктивными). Например, рекурсивно определяется факториал: 0 , )! 1 ( 0 , 1 ! N если N N N если N Данное определение состоит из двух утверждений. Первое утверждение носит название базисного. Базисное утверждение нерекурсивно. Второе утверждение носит название рекурсивного или индуктивного. Оно строится так, чтобы полученная в результате повторных применений цепочка определений сходилась к базисному утверждению. Рекурсия – это способ организации процесса вычисления, когда алгоритм обращается сам к себе. Одну и ту же задачу часто можно решить двумя способами: с помощью итерации (с использованием цикла) и с помощью рекурсии. В программировании рекурсивной называется подпрограмма, которая в процессе выполнения вызывает сама себя. Рекурсивная подпрограмма может быть реализована и как процедура, и как функция. Принцип рекурсии позволяет решить сложную задачу путем последовательного решения более простых подзадач (например, вычисление факториала, определение натуральных чисел и некоторых функций). Рекурсия необходима в тех случаях, когда требуется перебрать слишком много вариантов. Рекурсию принято считать одной из разновидностей циклического алгоритма. Рекурсивная форма организации позволяет придать алгоритму более компактный вид и экономить оперативную память компьютера. Содержание рекурсивного алгоритма отражает более сложный объект через более простой такого же типа. Обычно рекурсивный алгоритм содержит следующие основные части: условие для завершения цикла; тело рекурсии, которое содержит действия – операторы, предназначенные для выполнения на каждой итерации; САОД Лабораторная работа № 2 2 шаг рекурсии, на котором рекурсивный алгоритм вызывает сам себя. Если каждая рекурсивная подпрограмма вызывает саму себя один раз, то такая организация рекурсии называется линейной (рисунок 1). Рисунок 1. Структура подпрограммы R с линейной рекурсией Различают два вида рекурсии подпрограмм: 1) прямая или явная рекурсия — характеризуется существованием в теле подпрограммы оператора обращения к самой себе; 2) косвенная или неявная рекурсия — образуется при наличии цепочки вызовов других подпрограмм, которые в конечном итоге приведут к вызову исходной. Каждое обращение к рекурсивной подпрограмме вызывает независимую активацию этой подпрограммы. Совокупность данных, необходимых для одной активации рекурсивной подпрограммы, называется фреймом активации. Фрейм активации включает: • копии всех локальных переменных подпрограммы; • копии параметров-значений; • четырехбайтовые адреса параметров-переменных и параметров- констант; • копию строки результата (для функций типа string); Вход R(...) Выход? Выход Базисная ветвь Операторы " до вызова" R(...) Операторы "после вызова" Нет Да САОД Лабораторная работа № 2 3 • служебную информацию. Сначала в каждой активации выполняются операторы, расположенные до рекурсивного вызова, затем (при достижении условия выхода) – нерекурсивная часть очередной активации, а затем – операторы, записанные после рекурсивного вызова. Кроме линейной, достаточно часто встречается рекурсия, получившая название древовидной. При древовидной рекурсии подпрограмма в течение одной активации вызывает саму себя более одного раза. Полученная в данном случае последовательность вызовов имеет форму дерева. Основное требование к рекурсивным алгоритмам – процесс обращения не должен быть бесконечным. Другими словами, должна быть реализована проверка завершения вызова или в рекурсивном определении должно присутствовать ограничение или граничное условие, при котором дальнейшая инициализация рекурсии прекращается. Достаточно часто в рекурсивных алгоритмах используют некоторую управляющую переменную, при достижении определенного значения которой алгоритм прекращает свою работу. Обращение к рекурсивному алгоритму, реализованному в виде функции или процедуры, ничем не отличается от обычной подпрограммы. При каждом новом рекурсивном обращении к памяти создается новая копия подпрограммы со всеми локальными переменными. Увеличение числа копий будет происходить до тех пор, пока не действует ограничение. Максимально возможное количество копий рекурсивной подпрограммы, которое может находиться в памяти компьютера, называется глубиной рекурсии. Примером классической рекурсивной функции является возведение некоторого действительного числа x в целую степень N. Рекурсивно степень можно определить: 0 , * 0 , 1 1 N если x x N если x N N Пример решения с помощью рекурсии function StepN(n: integer; x: real): real; begin if n=0 then StepN := 1 else StepN := x*stepN(n-1, x); end; Пример решения с помощью итерации function StepN(n: integer; x: real): real; var i:integer; y:real; begin y:=1; for i:=1 to N do y:=y*x; StepN := y; end; САОД Лабораторная работа № 2 4 Задание 1. Задание должно быть выполнено обязательно двумя способами: - без использования рекурсии; - с использованием рекурсии. Примечание. Для вариантов 7-10 достаточно выполнить задание с использованием рекурсии. 2. Некоторые задания допускают различные способы интерпретации - выбор за студентом! Вариант 1. Перевод десятичного числа в двоичную систему. Вариант 2. Разработать программу для вычисления n-го члена последовательности Фибоначчи 1 = Ф 1, = Ф 1 > n при , Ф + Ф = Ф 1 0 2 - n 1 - n n Вариант 3. Дано натуральное число N. Выведите слово ДА, если число N является точной степенью двойки, или слово НЕТ в противном случае. Вариант 4. Дано натуральное число N. Вычислите сумму его цифр. Вариант 5. Дано число n, десятичная запись которого не содержит нулей. Получите число, записанное теми же цифрами, но в обратном порядке. САОД Лабораторная работа № 2 5 Вариант 6. Разработать программу поиска элемента в упорядоченном массиве Вариант 7. Разработать программу, в которой рекурсивная функция, проверяет правильность расстановки скобок в строке. При правильной расстановке выполняются условия: (а) количество открывающих и закрывающих скобок равно. (б) внутри любой пары открывающая – соответствующая закрывающая скобка, скобки расставлены правильно. Примеры неправильной расстановки: )(, ())(, ())(() и т.п. Вариант 8. В строке могут присутствовать скобки как круглые, так и квадратные скобки. Каждой открывающей скобке соответствует закрывающая того же типа (круглой – круглая, квадратной- квадратная). Напишите рекурсивную функцию, проверяющую правильность расстановки скобок в этом случае. Пример неправильной расстановки: ( [ ) ]. Вариант 9. Число правильных скобочных структур длины 6 равно 5: ()()(), (())(), ()(()), ((())), (()()). Напишите рекурсивную программу генерации всех правильных скобочных структур длины 2n. Указание: Правильная скобочная структура минимальной длины «()». Структуры большей длины получаются из структур меньшей длины, двумя способами: (а) если меньшую структуру взять в скобки, САОД Лабораторная работа № 2 6 (б) если две меньших структуры записать последовательно. Вариант 10. Разработать программу, которая содержит процедуру, выводящую на экран все возможные перестановки для целых чисел от 1 до N. Содержание отчета Титульный лист. Задание. Теоретические положения. Текст проекта (проектов). Результаты работы программы, не использующей рекурсию. Результаты работы программы, использующей рекурсию. Список использованных источников. Отчет оформляется в электронном виде с обязательным приложением проекта. САОД Лабораторная работа № 2 7 Контрольные вопросы 1. Дайте определение рекурсии? 2. Сравните использование рекурсии и итераций. 3. Назовите основные части рекурсивного алгоритма. 4. Сравните прямую и косвенную рекурсии. 5. Сформулируйте основное требование к рекурсивным алгоритмам. 6. Что такое фреймом активации? 7. Что включает фрейм активации? 8. Опишите линейную рекурсию. 9. Опишите древовидную рекурсию. |