如何通过组合较长列表中的任意两个元素(例如 4 个元素)来生成序列列表?
例如,我想得到'(1 2)
, '(1 3)
, '(1 4)
, '(2 3)
, '(2 4)
, 和'(3 4)
基于'(1 2 3 4)
。
如何通过组合较长列表中的任意两个元素(例如 4 个元素)来生成序列列表?
例如,我想得到'(1 2)
, '(1 3)
, '(1 4)
, '(2 3)
, '(2 4)
, 和'(3 4)
基于'(1 2 3 4)
。
该问题要求给定列表的 2 大小组合列表。它可以根据产生 n 大小组合的更一般的过程来实现:
(define (combinations size elements)
(cond [(zero? size)
'(())]
[(empty? elements)
empty]
[else
(append (map (curry cons (first elements))
(combinations (sub1 size) (rest elements)))
(combinations size (rest elements)))]))
当我们指定时,它按预期工作size=2
:
(combinations 2 '(1 2 3 4))
=> '((1 2) (1 3) (1 4) (2 3) (2 4) (3 4))
这是您指定的解决方案(一个函数,一个参数)。对于像'(next rest ...)
解决方案这样的输入,计算结果next
然后递归rest ...
-append
用于组合这两个部分。
(define (combine elts)
(if (null? elts)
'()
(let ((next (car elts))
(rest (cdr elts)))
(append (map (lambda (other) (list next other)) rest)
(combine rest)))))
> (combine '(1 2 3 4))
((1 2) (1 3) (1 4) (2 3) (2 4) (3 4))