我怎样才能得到(功能'(a b a a b c))=> ((a a)(b b))?

时间:2015-10-01 16:01:04

标签: recursion common-lisp

我正在学习常见的lisp教程,但我不熟悉它。

我如何获得以下结果?

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

1 个答案:

答案 0 :(得分:1)

这很容易。您有remove-ifremove-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)作为练习。