루비로 combination 생성하는 코드를 짜봤습니다. 최대한 효율적으로 한다고 했는데 결국은 수형도 (tree diagram) 그리듯이 만들어 버린;;
def v_0_set(list, r) v_i_set(list, -1, 0, r) end def v_i_set(list, prev_val, idx, r) start_idx = prev_val + 1 end_idx = (list.size - 1) - (r - 1 - idx) (start_idx..end_idx).inject([]) do |memo, val| memo << [val] end end def gen_comb(list, r) current_set = v_0_set(list, r) for i in (1..r-1) current_set = gen_comb_with_previous_value_set(list, current_set, i, r) end current_set.map do |idx| idx.map { |i| list[i] } end end def gen_comb_with_previous_value_set(list, prev_set, idx, r) prev_set.inject([]) do |memo, prev_val| memo += cart_prod(v_i_set(list, prev_val[-1], idx, r), prev_val) end end def cart_prod(list, val) list.inject([]) do |memo, i| memo << val + i end end list = [11,12,13,14,15] puts gen_comb(list, 1).inspect puts gen_comb(list, 2).inspect puts gen_comb(list, 3).inspect [/code] 결과는 [code] C:\tmp>ruby comb_gen.rb [[11], [12], [13], [14], [15]] [[11, 12], [11, 13], [11, 14], [11, 15], [12, 13], [12, 14], [12, 15], [13, 14], [13, 15], [14, 15]] [[11, 12, 13], [11, 12, 14], [11, 12, 15], [11, 13, 14], [11, 13, 15], [11, 14,15], [12, 13, 14], [12, 13, 15], [12, 14, 15], [13, 14, 15]] C:\tmp>