Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3_рекурсия_студ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
57.85 Кб
Скачать

15

Лабораторная работа № 3 рекурсия и итерация

Цель работы: ознакомиться с понятием рекурсии, ее видами и формами; выработать умения применения рекурсии при решении различных типов задач, закрепить знания и умения по применению итерационных алгоритмов.

Теоретические сведения

Для решения задач рекурсивными методами разрабатывают следующие этапы, образующие рекурсивную триаду:

  • параметризация – выделяют параметры, которые используются для описания условия задачи, а затем в решении;

  • база рекурсии – определяют тривиальный случай, при котором решение очевидно, то есть не требуется обращение функции к себе;

  • декомпозиция – выражают общий случай через более простые подзадачи с измененными параметрами.

Целесообразность применения рекурсии в программировании обусловлена спецификой задач, в постановке которых явно или опосредовано указывается на возможность сведения задачи к подзадачам, аналогичным самой задаче. При этом эффективность рекурсивного или итерационного способов решения одной и той же задачи определяется в ходе анализа работоспособности программы на различных наборах данных. Таким образом, рекурсия не является универсальным способом в программировании. Ее следует рассматривать как альтернативный вариант при разработке алгоритмов решения задач.

Повысить эффективность рекурсивных алгоритмов часто представляется возможным за счет пересмотра этапов триады. Например, введение дополнительных параметров, не оговоренных в условии задачи, в реализации декомпозиции могут быть применены другие соотношения, а также можно организовать расширение базовых случаев с сохранением промежуточных результатов.

Таблица 3.1 Понятия и термины, связанные с рекурсией

Понятие, термин

Неформальное определение, пояснение

Рекурсия

1. Введение в определение объекта ссылку на сам объект.

2. Прием сведения решения некоторой задачи к решению серии задач, подобных исходной.

Рекурсивный алгоритм (процедура, функция)

1. Алгоритм (функция, процедура) называется рекурсивным, если в его определении содержится прямой или косвенный вызов этого же алгоритма.

2. Рекурсивная функция - одно из математических уточнений интуитивного понятия вычислимой функции.

Рекуррентное соотношение (рекуррентная формула)

Формула вида an+p=F(an, an+1,…, an+p-1) (p>=1), позволяющая вычислять любой член бесконечной последовательности a1, a2,…, если заданы её первые p членов. Определяемая рекуррентной формулой последовательность называется возвратной.

Глубина рекурсивных вызовов

Количество элементов полной рекурсивной траектории в пространстве параметров.

Рекурсивные вычисления Прямой и обратный ход вычислений

Прямой ход соответствует совокупности всех предвычислений, реализуемых до входа рекурсивной траектории в базу. Обратный ход - совокупности отложенных вычислений, производимым после встречи с индикатором завершения рекурсивных вызовов.

Рекурсивный стек

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

Адаптивный рекурсивный алгоритм

Алгоритм, который благодаря рекурсивности учитывает те или иные индивидуальные характеристики решаемой задачи из области своего определения

Существуют три разных формы рекурсивных подпрограмм:

1) Форма с выполнением действий до рекурсивного вызова (с выполнением действий на рекурсивном спуске).

2) Форма с выполнением действий после рекурсивного вызова (с выполнением действий на рекурсивном возврате).

3) Форма с выполнением действий как до, так и после рекурсивного вызова (с выполнением действий как на рекурсивном спуске так и на рекурсивном возврате.

procedure Rec;

begin

S;

if условие then Rec;

end;

procedure Rec;

begin

if условие then Rec;

S;

end;

procedure Rec;

begin

S1;

if условие then Rec;

S2;

end;

Все формы рекурсивных процедур находят применение на практике. Многие задачи, в том числе вычисление факториала, безразличны к тому, какая используется форма рекурсивной процедуры.

Пример 1. Рассмотрим функцию вычисления факториала.

Разработаем рекурсивную триаду.

Параметризация: n – неотрицательное целое число.

База рекурсии: для n =0 факториал равен 1.

Декомпозиция: n!=(n-1)!xn.

Program Factorial;

var

n, b: Integer;

Function Fact ( a: Integer): Integer;

{Рекурсивая функция, вычисляющая а ! }

begin {Fact}

if a < 0 then

WriteLn (Ошибка в задании а')

else

if a = 0 then

Fact := 1

else Fact := a * Fact(a-1)

end {Fac} ;

{---------------}

begin {main}

WriteLn ('Введите число');

ReadLn (b) ;

WriteLn ('b!= ',Fact(b))

end {main} .

В результате первого рекурсивного обращения к функции Fact (т.е. обращения к самой себе) в памяти компьютера создается копия этой функции (с собственными локальными переменными), которой передается параметр со значением b-1. В результате второго рекурсивного обращения к функции Fact создается еще одна копия этой функции (как бы вложенная в первую и тоже с собственными локальными переменными), которой передается параметр со значением b-2. Затем функция Fact будет обращаться к самой себе до тех пор, пока она в последней своей копии не возвратит значение 1 (и при этом будут создаваться все новые ее копии, существующие независимо одна от другой).

«Движение вглубь» продолжается до тех пор, пока параметр, с использованием которого в очередной раз будет иметь место обращение к функции Fact, не окажется равным 0. К моменту завершения рекурсии в программе будут созданы B копий функции Fact, в поледеней из которых ее значение окажется равным 1. После этого будет иметь место «движение изнутри наружу», т.е. значение функции Fact из очередной «внутренней» ее копии будет умножаться на значение а из «внешней» копии, и при этом «внутренняя» копия функции ликвидируется. По завершении этого процесса окажется вычислен факториал числа B.

Алгоритмы с возвратом. Еще один класс задач, которые целесообразно решать рекурсивными методами, - это задачи, для решения которых не существует определенного алгоритма. В этом случае приходится искать решение методом проб и ошибок, подобно поиску выхода из лабиринта.

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

Итак последовательность действий: обследовать лабиринт - значит обследовать каждую из его ветвей. Дойдя до развилки, повторять алгоритм рекурсивно, возвращаясь из тупиковых ветвей. Если лабиринт не содержит циклов, рано или поздно вы найдете путь на волю. Если содержит, алгоритм немного усложняется, но все рано приводит к цели.

Реальные задачи, конечно, обычно сложнее, чем просто хождение по лабиринту. Однако в целом поиск решения практически такой же:

  • мы делаем очередной шаг в поиске решения,

  • фиксируем его и пытаемся на его основе сделать следующий.

  • Не найдя решение, мы должны попробовать другой допустимый шаг.

  • Если все возможные шаги уже перебраны, а решение так и не найдено, следует отступить на шаг назад и повторить процедуру поиска.

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