Сравнение списков и простых структур

Часто одну и ту же информацию можно одинаково хорошо представить и в виде списка, и в виде простой структуры. К примеру, два представления слова и его перевода в словаре могут выглядеть так:

[цветок, flower] представление в виде списка

cл (цветок, flower) представление в виде структуры

(cл обозначает словарь)

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

2. 4. Процедуры, выполняющие действия со списками Применение рекурсивных процедур для обработки списков

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

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

Примером простой процедуры, выполняющей обработку списка, может служить процедура "печатать_элементы". Единственным аргументом этой процедуры является список. Процедура выводит на печать все элементы заданного списка. Здесь "write" (вывести) - это встроенный предикат, который выводит на терминал значение своего аргумента. Встроенный предикат "n1 выполняет возврат каретки и перевод строки (т. е. переход к началу следующей строки).

% исходный вид процедуры при пустом списке

печатать_зпементы ([]). % (1)

% рекурсивное правило.

печатать_элементы ([Первый | Остаток]): - % (2)

write (Первый), n1, % вывод первого элемента

печатать_элементы (Остаток). % рекурсивный вызов

Использование процедуры "печатать_элементы" можно проиллюстрировать на примере следующих запросов:

|? -печатать_злементы ([один, путь (рэлей, нэшвилл)]).

один

путь (рэлей, нэшвилл)

да

|? –печатать_элементы ([а. b. с]).

а

b

с

да

Выполнение запроса к процедуре "печатать—элементы"

Выполнение предыдущего запроса можно рассматривать как последовательность вложенных вызовов процедуры "печатать_элементы", причем при каждом последующем вызове этой процедуры список будет короче, чем при предыдущем. Дерево доказательства, приведенное на рис. 2. 1, показывает, как при каждом последующем вызове процедуры "печатать_элементы" список, являющийся ее аргументом, сокращается.

Заметьте, что рекурсия прекращается при достижении процедурой "печатать_элементы" пустого списка, т. е. [].

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие