- •1. Рекурсивные алгоритмы
- •1.1. Основные определения
- •1.2. Накопления суммы или произведения.
- •Упражнение
- •Варианты задач
- •1.3. Быстрая сортировка
- •1.5.1.Основные определения
- •1.5.2. Пример задания некоторого языка l1 в бнф
- •1.5.3. Пример разработки программы "Синтаксический анализатор "
- •Ошибок нет Нет символа "[" Ошибка в выраженииВыходная форма:
- •2 Этап. Разбор второго правила. Раскрытие процедуры SimpExpr.
- •1.5.4. Лабораторная работа " Синтаксический анализатор "
- •Итак, метод для рассматриваемой задачи будет описан в виде синтаксических
- •На этом этапе можно продолжить проектирование в одном из двух направле-
- •2. Рекурсивный тип данных
- •Основные определения
- •2.2. Динамическое распределение памяти
- •Упражнение
- •Лабораторная работа “Генеалогическое дерево”
- •Варианты заданий
- •Литература
- •Содержание
Упражнение
Составить процедуру и функцию для вычисления суммы (или произведения) выражений, используя итеративный и рекурсивный методы вычислений, описав в спецификации оба метода.
Варианты задач
1) 10)19)
2) 11)20)
3) 12)21)
4) 13)22)
5) 14)23)
6) 15)24)
7) 16)25)
8) 17)26)
9) 18)27)
1.3. Быстрая сортировка
Быстрая сортировка относится к классу внутренних сортировок: сортировка массива. Задача сортировки состоит в упорядочивании некоторого массива по какому-либо признаку. Например, - по возрастанию значений элементов. Основное условие сортировки - это сортировка на том же месте (in situ), то есть на месте исходного массива без использования дополнительного массива.
Aлгоритм быстрой сортировки основан на многократном повторении операции разделения относительно барьера x.
Операция разделения. Один из элементов массива устанавливается как барьер. Например, выбирается x= ak, где k = n div 2. Двигаясь с концов массива, выбираются элемент ai>x из левой части и элемент aj<x из правой части. Эти элементы меняются местами. Результатом операции разделения будет измененный массив, в котором слева от барьера все элементы, значения которых меньше x, а справа - больше x.
Теперь каждая половина делится пополам и операция разделения применяется к каждой четверти массива. И так далее, пока все элементы не разместятся в заданном порядке.
x= ak
a1
a2
. . . ak
. . . an-1an
Ниже приводится процедура быстрой сортировки QuickSort, имеющая внутреннюю рекурсивную процедуру Sort, которая при каждом выполнении реализует операцию разделения и устанавливает новые границы для просмотра.
С целью обеспечения
выхода из рекурсивной процедуры в
качестве ее параметров выбираются
переменные l,
r
- границы подмассива, для которого
выполняется операция разделения.
Завершение рекурсии зависит от выполнения
условия l
r.
При каждом
рекурсивном обращении их значения
изменяются в сторону сближения, что
гарантирует окончание рекурсивного
процесса.
procedure QuickSort;
{сортировка от l-го до r-го}
procedure Sort(l,r:index);{рекурсивная}
var i,j:index; x,w:integer;
begin
{установка границ разделения}
i:=l; j:=r;
{вычисление барьера x}
x := a[(l+r) div 2];
{разделение элементов относительно x}
if l < j then Sort(l,j); { для левой части }
if i < r then Sort(i,r) { для правой части }
{ границы разделения совпали }
end;{Sort}
begin
Sort(1,n)
end;{QuickSort}
Упражнение. Измените формулу для вычисления барьера и сравните результаты измененной программы с первоначальной.
Математические итерационные методы
3. Выходные
данные.
вещ
x - корень уравнения.
4. Метод.
а) x0
= a;
б) xi
= f (xi-1),
i = 1, 2, ... ,
пока xi
- xi-1
> eps
1. Задача.
Найти корень уравнения х = f (x )
с точностью eps
методом простой итерации.
2. Входные
данные.
вещ
eps - точность,
вещ
x - начальное
приближение,
функция
f - правая часть уравнения.
{нахождение корня
методом простой итерации}
procedure
Simple
(eps : real; var x : real; f : func);
var y : real;
begin
y := f (x);
if abs(y-x) > eps then
begin
x:=y; Simple
(eps,x,f) end;
end;
Процедурный
тип func
должен быть определен вне процедуры
Simple в
виде:
func=function(x: real): real
Упражнение
Описать в виде рекурсивных процедур методы решения уравнений:
Метод Ньютона: 2. Метод деления пополам:
а) а) , ,
б) б)
в)
и метод вычисление корня :
3. а) ;б) .
Синтаксический анализатор