Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 Программирование на Паскаль.doc
Скачиваний:
18
Добавлен:
26.04.2019
Размер:
1.18 Mб
Скачать

Операции

Для очереди должны быть определены следующие операции:

empty(<нач_очереди>):boolean

- проверка очереди на пустоту;

add(<кон_очереди>,<нов_эл-т>):<кон_очереди>

- добавление элемента в конец очереди;

take_beg(<нач_очереди>):<тип_эл-тов_очереди>

- считывание значения первого элемента;

take_end(<кон_очереди>):<тип_эл-тов_очереди>

- считывание значения последнего элемента;

del(<нач_очереди>):<нач_очереди>

- удаление элемента из начала очереди.

Дек

Дональд Кнут1) ввел понятие усложненной очереди, которая называется дек (deque - Double-Ended QUEue - двухконцевая очередь). В каждый момент времени у дека доступны как первый, так и последний элемент, причем добавлять и удалять элементы можно и в начале, и в конце дека. Таким образом, дек - это симметричная двусторонняя очередь.

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

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

Рекурсия

В математике, да и не только в ней одной, часто встречаются объекты, определяемые при помощи самих себя. Они называются рекурсивными.

Например, рекурсивно определяется функция факториал:

0! =1

n! = n*(n-1)!, для любого натурального n.

Другим примером рекурсивного определения может послужить определение арифметического выражения, приведенное в лекции 2.

Рекурсивные подпрограммы

В программировании рекурсивной называется подпрограмма, исполнение которой приводит к ее же повторному вызову.

Если подпрограмма просто вызывает сама себя, то такая рекурсия называется прямой. Например:

procedure rec1(k: byte); function rec2(k: byte): byte;

begin begin

... ...

rec1(k+1); x:= rec2(k+1);

... ...

end; end;

Если же несколько подпрограмм вызывают друг друга, но эти вызовы "замкнуты в кольцо", то такая рекурсия называется косвенной.

В случае косвенной рекурсии возникает проблема с описанием подпрограмм: по правилу языка Pascal, нельзя использовать никакой объект раньше, чем он был описан. Следовательно, невозможно написать в программе:

procedure rec_А(k: byte);

begin

...

reс_В(k+1);

...

end;

procedure rec_В(k: byte);

begin

...

rec_А(k+1);

...

end;

И здесь полезной оказывается возможность отрывать объявление подпрограммы от ее описания (см. лекцию 8). Например, для косвенной рекурсии в случае двух процедур, вызывающих друг друга (rec_A -> rec_B -> rec_A), нужно такое описание:

procedure rec_А(k: byte); forward;

procedure rec_В(k: byte);

begin

...

reс_А(k+1);

...

end;

procedure rec_A;

begin

...

rec_В(k+1);

...

end;

Пример рекурсивного алгоритма

Задача. Двумерный массив целых чисел представляет цвета клеток рисунка. Найдите самую большую связную область одного цвета. (Связи по диагонали не учитываются.)