Common Lisp置换对没有相同的值

时间:2015-02-25 20:39:58

标签: common-lisp permutation

我正在尝试创建一个函数,给定一个列表,将返回两个元素不相等的元素对列表。例如,给定列表(1 2 3),它将返回((1 2)(1 3)(2 1)(2 3)(3 1)(3 2))。我现在的代码有效,但它会为每个匹配数字的地点添加nil; (例如,11)。

(defun make-permutations-without-identical(list)
(loop for x in list
  append (loop for y in list
               collect (append (if (not (equal x y)) (list x y))))))

该代码,给定(1 2 3)返回(NIL(1 2)(1 3)(2 1)NIL(2 3)(3 1)(3 2)NIL)。我该如何摆脱NIL?

2 个答案:

答案 0 :(得分:0)

如果您不想在结果列表中看到NIL,请不要收集 NIL。 仅收集您希望在结果列表中显示的项目。

答案 1 :(得分:0)

由于内循环生成的列表是新鲜的,您可以 nconc 它们。 循环宏具有除非部分,以便您可以有条件地收集部分。因此,您可以收集,除非(等于x y)

CL-USER> (loop for x in '(1 2 3)
              nconcing (loop for y in '(1 2 3)
                            unless (equal x y)
                            collect (list x y)))
((1 2) (1 3) (2 1) (2 3) (3 1) (3 2))