3
我有子列表的列表:生成方案中的所有可能性从列表
((a b c) (e f) (z h))
,我想产生这样的事:
((a e z) (a f z) (a e h) (a f h) (b e z) (b e h) ...) and so on.
我想,给子列表清单,生成包含来自每个输入子列表的元素的子列表的所有可能性。
我怎样才能得到这个输出?
我有子列表的列表:生成方案中的所有可能性从列表
((a b c) (e f) (z h))
,我想产生这样的事:
((a e z) (a f z) (a e h) (a f h) (b e z) (b e h) ...) and so on.
我想,给子列表清单,生成包含来自每个输入子列表的元素的子列表的所有可能性。
我怎样才能得到这个输出?
你所描述的名单列表的cartesian product,这里有一个可能的实现(在球拍作品):
(define (cartesian-product lsts)
(foldr (lambda (lst acc)
(for*/list ((x (in-list lst))
(y (in-list acc)))
(cons x y)))
'(())
lsts))
现在,如果你不使用的球拍,这里的大部分使用标准香草实施程序;它应该在任何Scheme解释定义了fold-right
样的程序工作:
(define (flatmap f lst)
(apply append (map f lst)))
(define (cartesian-product lsts)
(foldr (lambda (lst acc)
(flatmap (lambda (x)
(map (lambda (y)
(cons x y))
acc))
lst))
'(())
lsts))
无论哪种方式,它按预期工作:
(cartesian-product '((a b c) (e f) (z h)))
=> '((a e z) (a e h) (a f z) (a f h) (b e z) (b e h)
(b f z) (b f h) (c e z) (c e h) (c f z) (c f h))
为* /列表:不确定的; 不能引用未定义的标识符 我应该导入一些东西吗? – 2013-04-05 22:27:46
...所以,你不使用球拍:(。我可以将上面的代码翻译成一个更加中性的Scheme的方言,但是它会花费我一段时间。 – 2013-04-05 22:29:37
我将不胜感激!:) – 2013-04-05 22:34:26