Recursion 使用迭代而不是递归将集合的元素分组为不相交的子集

Recursion 使用迭代而不是递归将集合的元素分组为不相交的子集,recursion,common-lisp,Recursion,Common Lisp,我遇到了,想知道他使用嵌套的mapcan-mapcar-构造对问题27的递归解决方案是否也可以使用嵌套循环编写 他的解决方案绝对非常优雅: (defun group (set sizes) (cond ((endp sizes) (error "Not enough sizes given.")) ((endp (rest sizes)) (if (= (first sizes) (length set)) (list (list set

我遇到了,想知道他使用嵌套的
mapcan
-
mapcar
-构造对问题27的递归解决方案是否也可以使用嵌套循环编写

他的解决方案绝对非常优雅:

(defun group (set sizes)
  (cond
    ((endp sizes)
     (error "Not enough sizes given."))
    ((endp (rest sizes))
     (if (= (first sizes) (length set))
         (list (list set))
         (error "Cardinal mismatch |set| = ~A ; required ~A"
                (length set) (first sizes))))
    (t
     (mapcan (lambda (combi)
               (mapcar (lambda (group) (cons combi group))
                       (group (set-difference set combi) (rest sizes))))
            (combinations (first sizes) set)))))
组合功能
定义为:

我从一个简单的方法开始:

(defun group-iter (set sizes)
  (loop :with size = (first sizes)
        :for subgroup :in (combination size set)
        :for remaining = (set-difference set subgroup)
        :collect (list subgroup remaining) :into result
        :finally (return result)))
其结果是:

> (group-iter '(a b c d e f) '(2 2 2))
 (((A B) (F E D C)) ((A C) (F E D B)) ((A D) (F E C B)) ((A E) (F D C B))
  ((A F) (E D C B)) ((B C) (F E D A)) ((B D) (F E C A)) ((B E) (F D C A))
  ((B F) (E D C A)) ((C D) (F E B A)) ((C E) (F D B A)) ((C F) (E D B A))
  ((D E) (F C B A)) ((D F) (E C B A)) ((E F) (D C B A)))
但是现在我完全无法实现嵌套,它负责
剩余部分的进一步处理。据我所知,总有一种方法可以用迭代来表示递归,但它在这里是什么样子的呢

> (group-iter '(a b c d e f) '(2 2 2))
 (((A B) (F E D C)) ((A C) (F E D B)) ((A D) (F E C B)) ((A E) (F D C B))
  ((A F) (E D C B)) ((B C) (F E D A)) ((B D) (F E C A)) ((B E) (F D C A))
  ((B F) (E D C A)) ((C D) (F E B A)) ((C E) (F D B A)) ((C F) (E D B A))
  ((D E) (F C B A)) ((D F) (E C B A)) ((E F) (D C B A)))