Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
31.03.2015
Размер:
363.01 Кб
Скачать

Упражнение

Составить процедуру и функцию для вычисления суммы (или произведения) выражений, используя итеративный и рекурсивный методы вычислений, описав в спецификации оба метода.

Варианты задач

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}

Упражнение. Измените формулу для вычисления барьера и сравните результаты измененной программы с первоначальной.

  1. Математические итерационные методы

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

Упражнение

Описать в виде рекурсивных процедур методы решения уравнений:

  1. Метод Ньютона: 2. Метод деления пополам:

а) а) , ,

б) б)

в)

и метод вычисление корня :

3. а) ;б) .

  1. Синтаксический анализатор

Соседние файлы в папке METOD2