Как добавить текущий список с другим элементом в схеме? - PullRequest
0 голосов
/ 21 апреля 2011

Допустим, у меня есть список: a b a a a c e.Я хочу избавиться от всех соседних дубликатов, то есть двух а в середине.Таким образом, список становится a b a c e.

Алгоритм, который я имею в виду, имеет следующий вид:
- Проверьте, равно ли текущее значение следующему значению,

(equal? (car lst) (car (cdr lst)))

они равны, тогда я хочу пропустить дублирующий элемент, но я не знаю, как добиться этого поведения в схеме?Любая идея?
- Если они не равны, продолжайте обходить список.

Кстати, есть ли способ реализовать итерационный цикл for в схеме для этих типов задач?Потому что я чувствую, что рекурсия просто излишня для этой простой проблемы.

Спасибо,

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Я давно не писал Схемы, но, может быть, это будет вам полезно:

(define (remove-adjacent-duplicates list)
    (if (empty? list)                    
        '()                              
        (if (equal? (car list) (cadr list))
            (remove-adjacent-duplicates (cdr list))
            (cons (car list) (remove-adjacent-duplicates (cdr list)))))

О, и не бойтесь рекурсии, особенно в Схеме.Это весело!:)

1 голос
/ 21 апреля 2011

Вот итерационный ответ для этой проблемы, используя fold:

(define (uniq lst)
  (fold (lambda (elem result)
          (if (and (pair? result) (equal? elem (car result)))
              result
              (cons elem result)))
        '() (reverse lst)))

(В будущем, когда вы пытаетесь преобразовать список во что-то, рассмотрите возможность использования fold, и каждый раз, когда вы пытаетесь преобразовать что-то в список, подумайте об использовании unfold. Они очень мощные функции!)

0 голосов
/ 21 апреля 2011

В этом случае вы захотите сохранить машину cdr, чтобы превратить ее в результат вашего рекурсивного вызова (откажитесь от машины, это облегчает проверку в случае с 3 a). Теперь вопрос, который вы задаете, это что такое рекурсивный вызов. Что ж, теперь вы отправляете машину из CDR в рекурион на CDR.

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