http://twitter.com/ken5a/status/338877331106050048 "N個の異なる要素から構成される集合{0,1,...,N-1}をK個のグループに分割したい。 注:グループ内での順序やグループ同士の順序はない(つまり{{0,1}, {2, 3}} == {{3,2}, {1, 0}})" "N=3なら [((0, 1, 2),), ((0,), (1, 2)), ((0, 2), (1,)), ((0, 1), (2,)), ((0,), (1,), (2,))]"
- [[0,2],[1],[3]]という分割結果に対し,0→[0,2],1→[1],2→[3]という添字を付け,元の数字の順に添字を並べた0102を添字列と呼ぶ.
- 再帰的に添字列を作る.
- 先頭を0とし,振れる数字を0から(今まで振った数+1)までとすれば,結果の重複は除ける.
- (例えば添字列0201([[0,2],[3],[1]])は生成されない)
- これは,重複した分割結果[[0,2],[1],[3]]や[[3],[1],[0,2]]などの中で,それぞれの最小の数字が昇順になっている結果だけを生成していることになる.