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

标签 algorithm list lisp common-lisp

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

因此,例如调用列表上的函数((1 2)(1 2))应该返回一个列表((1 1)(1 2)(2 1)(2 2))。输入列表可以是任意长度,但不保证子列表具有相同的长度。

我知道如何使用子列表中的成对元素获取此信息(输入 ((1 2) (1 2)) 返回 ((1 1) (2 2)),但这对于弧一致性算法来说还不够好我正在尝试写作,但遇到困难。

谢谢。

最佳答案

如果您不想使用库,这里的代码可以做同样的事情,并且可以处理任意数量的列表:

(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))

关于algorithm - Lisp:如何从列表中包含的列表中获取元素的所有可能组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18675913/

相关文章:

lisp - 如何在 Common Lisp 中返回变量的值和名称

emacs - SLIME who-用 'nesting exceeds max-lisp-eval-depth' 报错

algorithm - 在 (x,y) 点的集合上生成图形

c# - 做完整的循环路径,最短路径练习?

Python:如何不在for循环的最后一个元素中打印逗号?

java - 使用比较器对列表名称和日期进行排序

常见的 lisp、CFFI 和实例化 c 结构

algorithm - 当您有先前的答案时,更快的计算模数的方法?

algorithm - 使用深度优先搜索在图中查找循环

php - 维护用户列表 - MySQL/PHP