使用较长列表DrRacket中的任意两个元素创建列表

时间:2013-08-05 18:34:23

标签: list scheme racket combinations elements

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

例如,我希望基于{{'(1 2)'(1 3)'(1 4)'(2 3)'(2 4)'(3 4) 1}}。

3 个答案:

答案 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)

我认为你想要this answer所有的排列。

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

(permutations 2 '(1 2 3 4))