3

如何通过组合较长列表中的任意两个元素(例如 4 个元素)来生成序列列表?

例如,我想得到'(1 2), '(1 3), '(1 4), '(2 3), '(2 4), 和'(3 4)基于'(1 2 3 4)

4

3 回答 3

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))
于 2013-08-05T21:12:48.777 回答
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))
于 2013-08-06T02:44:14.190 回答
0

我认为您希望按照此答案进行所有排列。

使用他的排列函数定义,您可以执行以下操作:

(permutations 2 '(1 2 3 4))
于 2013-08-05T18:47:37.253 回答