Как использовать встроенный фильтр функций с лямбда в программировании схемы? - PullRequest
0 голосов
/ 02 ноября 2019
"Implement unique, which takes in a list s and returns a new list containing the same elements as s with duplicates removed."

scm> (unique '(1 2 1 3 2 3 1))
(1 2 3)
scm> (unique '(a b c a a b b c))
(a b c)

What I've tried so far is:

(define (unique s)
    (cond
        ((null? s) nil)
        (else (cons (car s)(filter ?)

Этот вопрос необходим для использования встроенной функции фильтра. Общий формат функции фильтра (фильтр предиката lst), и я застрял на части предиката. Я думаю, что это должна быть лямбда-функция. Кроме того, что я должен сделать, чтобы решить этот вопрос рекурсивно?

1 Ответ

1 голос
/ 02 ноября 2019

(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 этого элемента в начале результата, у вас будет список без дубликатов.

И этовозможное решение вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...