Схема удаления соседних дубликатов

avatar
Adam Morad
8 апреля 2018 в 11:38
311
2
-1

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

Пример:

(remove-adjacent-duplicates ’(y a b b a d a b b a d o o))
'(y a b a d a b a d o)

(remove-adjacent-duplicates ’(yeah yeah yeah))
'(yeah)

Как это можно сделать?

Источник
uselpa
8 апреля 2018 в 14:04
0

Что вы пробовали?

Ответы (2)

avatar
Sylwester
8 апреля 2018 в 18:51
1

Вот как это сделать:

Если аргументом является пустой список или cdr является пустым списком, то результатом является аргумент.

В противном случае, если первый и второй элементы совпадают, то пропустить первый элемент.

Еще cons первый элемент с рекурсией с cdr или аргументом.. например,

(remove-adjacent-duplicates '(a b)) ; ==
(cons (car '(a b)) (remove-adjacent-duplicates (cdr '(a b))))
avatar
Adam Morad
10 апреля 2018 в 08:07
1

Вот решение - сначала мы проверяем, пуст ли список, если нет - проверяем наличие дубликатов по частям.

(define (strip-duplicates ls)
  (if (null? ls)
      '()
      (let ((first (car ls)))
        (let loop ((known first)
                   (rest (cdr ls))
                   (so-far (list first)))
          (if (null? rest)
              (reverse so-far)
              (let ((first-remaining (car rest)))
                (loop first-remaining
                      (cdr rest)
                      (if (equal? known first-remaining)
                          so-far
                          (cons first-remaining so-far)))))))))
Will Ness
10 апреля 2018 в 11:49
0

Ответы, содержащие только код, могут быть автоматически помечены как некачественные.