如何获得满足Common Lisp条件的列表集和子集的所有可能组合

时间:2015-11-13 17:24:06

标签: lisp common-lisp clisp

对于L =(ABCD)的元素列表,要生成满足元素的词典顺序(A< B< C< D< Z)的元素的所有可能组合,将生成所有组合。 例如L =(ABCD)井输出(A),(B),(C),(D),(AB),(BC),(CD),(ABC),(BCD),(ABCD)。 / p>

2 个答案:

答案 0 :(得分:0)

看起来你只是编写简单的函数来获取列表的幂集,然后只需删除一个空集,然后以任何你想要的方式对它进行排序。

var template = '<button id="myButton_#" class="myButtonsClass" type="button">testButton</button>';

for (var i=0; i<10, i++) {
   console.log(template.replace('#',i));
}

要准确获取您的编辑输出,您可以删除NIL并将其反转:

(defun powerset (lst)
  (if lst (mapcan (lambda (el) (list (cons (car lst) el) el))
                (powerset (cdr lst)))
      '(())))

CL-USER> (powerset '(A B C D))
((A B C D) (B C D) (A C D) (C D) (A B D) (B D) (A D) (D) (A B C) (B C) (A C)
 (C) (A B) (B) (A) NIL)

这是你想要的吗?

更新。对不起,没有提到你想让它以另一种方式解决。你应该求助它:

CL-USER> (reverse (remove nil (powerset '(A B C D))))
((A) (B) (A B) (C) (A C) (B C) (A B C) (D) (A D) (B D) (A B D) (C D) (A C D)
 (B C D) (A B C D))

这是另一种更具比较性的解决方案,使用CL-USER> (sort (reverse (remove nil (powerset '(A B C D)))) #'< :key #'length) ((A) (B) (C) (D) (A B) (A C) (B C) (A D) (B D) (C D) (A B C) (A B D) (A C D) (B C D) (A B C D)) 宏,执行您所描述的内容:

loop

答案 1 :(得分:0)

可以通过以下函数获取lexicographical(非词汇学)顺序,该函数按字典顺序检查列表a是否在列表b之前:

(defun lex<= (a b)
  (or (null a)
      (and b 
           (string<= (car a) (car b))
           (lex<= (cdr a) (cdr b)))))

所以,您可以生成所有组合,例如在coredump的答案中,然后使用(sort result #'lex<=)对它们进行排序。