一尘不染

Lisp:如何从列表中包含的列表中获取元素的所有可能组合?

algorithm

我需要在Common-Lisp中编写一个函数,该函数接受一个列表列表并返回一个包含子列表元素的所有可能组合的列表。

因此,例如在诸如((1 2)(1 2))之类的列表上调用该函数应返回诸如((1 1)(1 2)(2 1)(2
2))之类的列表。输入列表可以是任意长度,子列表的长度也不能保证相同。

我知道如何使用子列表中的配对元素来实现这一点(inputtting((1 2)(1 2))返回((1 1)(2
2)),但这对于弧一致性算法来说还不够好试图写,我被困住了。

谢谢。


阅读 529

收藏
2020-07-28

共1个答案

一尘不染

如果您不想使用库,可以使用以下代码执行相同的操作,并可以使用任意数量的列表:

(defun combinations (&rest lists)
  (if (endp lists)
      (list nil)
      (mapcan (lambda (inner-val)
                (mapcar (lambda (outer-val)
                          (cons outer-val
                                inner-val))
                        (car lists)))
              (apply #'combinations (cdr lists)))))

[2]> (combinations '(1 2))
((1) (2))
[3]> (combinations '(1 2) '(3 4))
((1 3) (2 3) (1 4) (2 4))
[4]> (combinations '(1 2) '(3 4) '(5 6))
((1 3 5) (2 3 5) (1 4 5) (2 4 5) (1 3 6) (2 3 6) (1 4 6) (2 4 6))
2020-07-28