如何通过组合较长列表中的任何两个元素来生成序列列表,例如4个元素?
例如,我希望基于{{'(1 2)
,'(1 3)
,'(1 4)
,'(2 3)
,'(2 4)
和'(3 4)
1}}。
答案 0 :(得分:3)
该问题要求给定列表的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))
答案 1 :(得分:2)
这是您指定的解决方案(一个函数,一个参数)。对于'(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))
答案 2 :(得分:0)