Как запустить этот функциональный программный код? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь запустить этот код, который предположительно удаляет дубликаты из отсортированного списка чисел.

    (defun unique (x)
(cond( (null x) x )
( (null (cdr x)) x )( (equal (car x) (cdr x)) (unique (cdr x)) )( t (cons (car x) (unique (cdr x))) )))

Я пытаюсь вызвать эту функцию, набрав:

(print (unique '(2 2 3 4 4 5)))

My выходные данные в настоящее время отображаются следующим образом:

(2 2 3 4 4 5)

Очевидно, что это, кажется, не удаляет дубликаты, если вообще что-то.

1 Ответ

4 голосов
/ 03 апреля 2020

Ошибка в форме: (equal (car x) (cdr x)). car возвращает первый элемент списка, а cdr возвращает остальную часть списка, поэтому сравнение проводится не между первым и вторым элементом списка, а между первым элементом и списком без первого элемента. (и это сравнение всегда будет выдавать false для обычных списков).

Чтобы исправить ошибку, функция должна использовать cadr вместо cdr: (equal (car x) (cadr x)): функцию cadr (или ее синоним second) эквивалентно car (cdr и возвращает второй элемент списка. Так что это правильная версия:

CL-USER> (defun unique (x)
           (cond ( (null x) x )
                 ( (null (cdr x)) x ) 
                 ( (equal (car x) (cadr x)) (unique (cdr x)) )
                 ( t (cons (car x) (unique (cdr x))) )))
UNIQUE
CL-USER> (unique '(1 1 2 2 3))
(1 2 3)
...