2015-10-01 10 views
-4

Я изучаю общие учебные пособия, но я не знаком с этим.Как я могу получить (function '(a b a a b c)) => ((a a a) (b b))?

Как я могу получить следующий результат?

(function '(a b a a b c)) => ((a a a) (b b)) 
+7

SO не является бесплатной услугой кодирования, вы должны попытаться решить ее самостоятельно, это единственный способ узнать, как программировать. Если вы не можете заставить его работать, опубликуйте то, что вы попробовали, и мы покажем вам, где вы поступили неправильно, и как его исправить. – Barmar

ответ

1

Это довольно просто. У вас есть remove-if и remove-if-not. Они работают так:

(remove-if-not (lambda (x) (eq x 'a)) '(a b a a b c)) ; ==> (a a a) 
(remove-if (lambda (x) (eq x 'a)) '(a b a a b c)) ; ==> (b b c) 

Теперь, если у вас есть аргумент, и это не nil использовать выше, чтобы сделать первый элемент результата и то, что список, чтобы перейти к рекурсии.

Типичная рекурсивная функция:

(defun group (list) 
    (if (endp list) 
     nil 
     (cons <??> (group <??>)))) 

Есть более эффективные способы сделать это, и вы можете сделать свои собственные функции, вместо того, чтобы полагаться на remove-if(-not) в качестве упражнения.