長いリストから任意の 2 つの要素を組み合わせて、たとえば 4 つの要素を使用してシリアル リストを生成するにはどうすればよいですか?
たとえば'(1 2)
、'(1 3)
、'(1 4)
、'(2 3)
、'(2 4)
、および'(3 4)
に基づいて取得したい'(1 2 3 4)
。
長いリストから任意の 2 つの要素を組み合わせて、たとえば 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))
これは、指定したとおりのソリューションです(1つの関数、1つの引数)。'(next rest ...)
ソリューションのような入力の場合、結果を計算してnext
から再帰しますrest ...
- を使用append
して 2 つの部分を結合します。
(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))