2

(項目のリスト) のリストを取得し、すべてのリスト内のすべての項目のすべての可能な組み合わせを列挙する関数が必要です。それで

someCombo :: [[a]] -> [[a]]
someCombo = undefined

こんなのあったら

[ 
 [a1,b1],
 [a2,b2,c2],
 [a3,b3]
]

このような答えを吐き出したいのですが、各リストの要素が他のすべてのリストのすべての要素と一致しています。おそらく、この場合、最終的なリストには 12 個の要素があるでしょう。

[
  [a1,a2,a3],[a1,a2,b3],[a1,b2,a3],[a1,b2,b3],...,[b1,c2,b3]
]

メイン引数には、任意の数のリストを指定できます。これは本当に単純なはずですが、頭を包み込むことはできません。2 つまたは 3 つのリストに対しては実行できますが、任意の数のリストを再帰的に機能させることはできません。ああ、結果のリストの順序は気にしません.12個すべて(または何でも)ある限り.

誰かがこれが何のためにあるのか知りたい場合は、各リフトの前にバーベルにプレートを配置する順序を決定するアルゴリズムを実装する必要がある最後の部分であり、エクササイズごとに行うプレートのシャッフルの量を最小限に抑えます. これにより、ワークアウトごとに数分節約できると思います。そのためには、リフトごとに特定のプレート セットを使用するすべての可能なワークアウトを列挙し、各リフトのプレート順序の組み合わせを見つけて、シャッフルの量を最小限に抑える必要があります。

4

1 に答える 1

12
import Control.Monad

someCombo = sequence

試してみよう:

>>> someCombo [[1, 2], [3, 4]]
[[1,3],[1,4],[2,3],[2,4]]

これを理解するには、リスト内包表記またはリストモナドを理解する必要があります。 sequence効果的にこれを行います:

sequence [[1, 2], [3, 4]]
= do x <- [1, 2]
     y <- [3, 4]
     return [x, y]

xこれは、「 1 と 2 の範囲を指定し、3 と 4 の範囲を指定して、 andyのすべての順列を返す」ということと考えることができます。xy

于 2013-01-23T03:18:43.667 に答える