近岡@高岡西高です。

> [1,2,3,4].conbination(2)   => [ [1,2],[1,3],[1,4],[2,3],[2,4],[3,4] ]
> [1,2,3].conbination([4,5]) => [ [1,4],[1,5],[2,4],[2,5],[3,4],[3,5] ]
>
>こんな結果を帰すものを ruby的に作るにはどうしたものでしょうか。
>

引数ですが、例えば、
[1,2,3].conbination(1,[4,5]) => [ [1,4,5],[2,4,5],[3,4,5] ]
[1,2,3].conbination(2,[4,5]) => [ [1,2,4,5],[1,3,4,5],[2,3,4,5] ]
・・・
[1,2,3].conbination(1,[]) => [ [1],[2],[3] ]       # 第2引数は省略可?
[1,2,3].conbination(2,[]) => [ [1,2],[1,3],[2,3] ]
・・・
のような仕様にすれば、
[a,b,c,…,d,e].conbination(n,[])の帰す配列は、2つの配列の連結
 [a,b,c,…,d].conbination(n,[]) + [a,b,c,…,d].conbination(n-1,[e])
で与えられ、
[a,b,c,…,d,e].conbination(n,[f,…,g])の帰す配列は、2つの配列の連結
 [a,b,c,…,d].conbination(n,[f,…,g]) + [a,b,c,…,d].conbination(n-1,[e,f,…,g])
で与えられ、
いずれも単純なアルゴリズムになります?

もっとも、[a,b,c,…,d,e].size = N のとき、
再帰ルーチンを呼び出す回数がほぼ(2^N )回になるので、
実用的ではありませんが。

ついでに言えば、例えば [1,2,3].conbination(2,[4,5]) の帰す配列は、
 [1,2,3].conbination(2,[]).map{|k| [k]+[4,5] }
の帰す配列にも等しくなりますね。

0----+----1----+----2----+----3----+----4----+----5----+----6
近岡 宣吉  Chikaoka, Nobuyoshi
富山県立高岡西高等学校(数楽科)