なんかすごくよく使うので実装してみた。よく考えると単純に再帰で実装できることにきづいて10分くらいでちょちょっとかいてみた。

def make_comb(array, num)
return [[]] unless num > 0

size = array.size
ret_arr = []
(size-num + 1).times{|ind|
ret_arr += clonecker([array[ind]],make_comb(array[(ind+1)..-1],num-1))
}

ret_arr
end

def clonecker(array1, array2)
array2.map{|item|
array1 + item
}
end

例えば、make_comb([1,2,3],2)とやると[1,2][1,3][2,3]が得られます。ほとんど同じ方法で順列も作れます。