Page 29

ПРО

№13 (апрель) 2011

граммист

Мират Каденов

http://mathdev.org/mirat

НОВОСТИ ПО

SCHEME. НЕКОТОРЫЕ ЗАМЕТКИ О ФП

Познакомился я тут с языком Scheme, правда, не по своей воле. Ну что я могу сказать? Мой «зачерствевший императивнодекларативный разум» конечно, был сильно удивлен этим новым обстоятельством. Особенно больно было в первое время. Чувствуешь, как шестерни в голове, уже отвыкшие от вращения, заржавевшие за многие годы, начинают со страшным скрипом и хрустом проворачиваться. Но, забавно. Давайте похрустим вместе...

Постановка задачи

этому даже такие тривиальные задачи, как

Ну вот, к примеру, такая простая задачка: на

очень непривычно, но, в то же время, красиво

вход

дано

одинаковых

два

множества

элементов,

(списка)

надо

найти

без их

«симметрическую» разность т.е, все элементы, которые

встречаются

исходных множеств.

только

в

одном

из

Поиск элемента Как решать эту задачу? Начнем с того, что полезно бы иметь функцию, принимающую

элемент и множество, и выдающую true или

false в зависимости от того, есть этот элемент в данном множестве или нет.

Такую функцию в Scheme можно объявить так:

(define (search elem list) (if (null? list) #f (if (equal? elem (car list)) #t (search elem (cdr list) ) ) ) )

Как видим, циклов в Scheme нет*, переменных

тоже. Все, что есть – рекурсия. Благодаря

поиск элемента в списке иногда решаются и элегантно.

Пересечение множеств Дальше – больше. Итак, вопрос: как найти

пересечение двух множеств A и B?. То есть

такое множество, каждый элемент которого содержится

в

A

и

B

одновременно.

Естественно возникает желание сделать два вложенных

цикла:

внешний

проходит

по

элементам первого множества, а второй ищет эти элементы во втором.

Еще один нюанс: в Scheme нельзя передавать в

функцию

параметры

затруднительно

найти

по

ссылке.

способ

Да

и

этим

воспользоваться: язык не позволит. И вообще переменных

в

обычном

смысле

слова

в

Scheme нет. Есть императивные (звучит, чуть ли

не

как

империалистические)

хаки,

но

использовать их мы не будем. Тогда, как и где функция

поиска

пересечения

будет

накапливать элементы искомого множества? Правильно, она будет передавать себе же

множество, а возвращать это же множество плюс

найденные

элементы.

Сама

верхняя

функция вызывается с пустым аргументом.

Ну, а так как теперь рекурсия правит балом,

* Не совсем верно, зависит от диалекта / Редакция.

29

PROgrammist, №13  

Official editorial layout

PROgrammist, №13  

Official editorial layout

Advertisement