Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика и ВТ Брукшир.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.07 Mб
Скачать

4.4 Итеративные структуры

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

4.4.1Алгоритм последовательного поиска

Рассмотрим задачу поиска определенного значения в списке. Мы хотим построить алгоритм, который определяет, есть ли в списке такое значение. Если есть, то поиск считается успешным; в противном случае поиск считается неудачным. Допустим, что элементы списка упорядочены по какому-то правилу. Например, если это список имен, то предположим, что его элементы располагаются в алфавитном порядке. Или, если список состоит из числовых значений, то элементы списка располагаются по возрастанию значения.

Для того чтобы сделать первый шаг в построении алгоритма, представим, что нам нужно найти некоторое имя в списке, состоящем из 20 гостей. В таком случае мы можем просмотреть список от начала до конца, сравнивая каждый элемент с искомым именем. Если мы найдем имя, то поиск закончится успехом. Однако, если мы дойдем до конца списка, не найдя имени, то поиск закончится неудачей. На самом деле поиск можно считать неудачным, когда мы достигли имени, которое начинается с буквы, находящейся в алфавите после первой буквы искомого имени. (Не забывайте, что элементы списка располагаются в алфавитном порядке, поэтому если мы достигли имени, которое в алфавитном порядке должно находиться после искомого, значит, нужного имени в списке нет.) Идея заключается

в том, чтобы продолжать поиск до тех пор, пока в списке есть имена и искомое имя больше, чем рассматриваемое имя списка.

Псевдокод этого процесса можно записать следующим образом:

Выбрать первый элемент списка как ПроверяемоеЗначение.

while (ИскомоеЗначение > ПроверяемоеЗначение и остаются не рассмотренные элементы списка)

do (Выбрать в качестве ПроверяемоеЗначение следующий элемент списка)

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

if (ИскомоеЗначение = ПроверяемоеЗначение) then (Поиск успешен.) else (Поиск неудачен.)

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

if (список пустой)

then (поиск неудачен.) else (...)

Таким образом, мы получили процедуру, показанную в листинге 4.1. Обратите внимание на то, что эту процедуру можно вызвать из других процедур, используя выражение

Применить процедуру Поиск к списку пассажиров, чтобы найти имя Даррел Бейкер.

чтобы выяснить, является ли Даррел Бейкер пассажиром. Или выражение

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

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

Листинг 4.1. Алгоритм последовательно поиска, записанный с помощью псевдокода

procedure Поиск (Список. ИскомоеЗначение) if (Список пустой)

then (поиск неудачен) el se

(Выбрать первый элемент Список как ПроверяемоеЗначение;

while (ИскомоеЗначение > ПроверяемоеЗначение и остаются не рассмотренные элементы) do

(Выбрать в качестве ПроверяемоеЗначение следующий элемент Список); if (ИскомоеЗначение = ПроверяемоеЗначение) then (Поиск успешен.) else (Поиск неудачен.) ) end if

Алгоритм (см. листинг 4.1) последовательно рассматривает элементы списка в том порядке, в каком они располагаются в списке. Поэтому он и называется алгоритмом последовательного поиска (sequential search). Благодаря своей простоте он часто используется для коротких списков. Однако когда мы имеем дело с длинными списками, последовательный поиск не так эффективен, как другие виды поиска, которые мы рассмотрим позже.