(filter predicate list)
возвращает новый список, полученный путем исключения всех элементов списка, которые не удовлетворяют предикату. Поэтому, если вы получите первый элемент списка, чтобы исключить его дубликаты, если они существуют, вы можете просто удалить из остального списка все элементы, равные ему, что-то вроде:
(filter
(lambda (x) (not (eqv? x (first lst)))) ; what to maintain: all the elements different from (first lst)
(rest lst)) ; the list from which to eleminate it
дляэкземпляр:
(filter (lambda (x) (not (eqv? x 1))) '(2 1 3 2 1 4))
производит (2 3 2 1 4)
, исключая все вхождения 1
.
Тогда, если вы cons
первый элемент со списком, полученным в результате фильтра, выубедитесь, что в результирующем списке есть только «копия» этого элемента.
Последний шаг, необходимый для написания вашей функции, - это рекурсивное повторение этого процесса. В общем случае, когда вам нужно применить рекурсивный процесс, вы должны найти конечный случай, в котором результат функции может быть немедленно передан (как пустой список для списков), и общий случай, в котором вы выражаетерешение, предполагающее, что у вас уже есть функция для «меньшего» ввода (например, список с меньшим числом элементов).
Рассмотрим это определение:
define (unique s)
(if (null? s)
'()
(cons (first s)
(filter
(lambda (x) (not (eq? x (first s))))
(unique (rest s))))))
(rest s)
список, который короче sТаким образом, вы можете применить unique
к нему и найти список без дубликатов. Если из этого списка вы удалите дубликаты первого элемента с filter
, а затем cons
этого элемента в начале результата, у вас будет список без дубликатов.
И этовозможное решение вашей проблемы.