再帰脳
再帰をパッと思いつけるのは、そいういう脳の仕組みだから、、だと思う。再帰脳ではない私は、上記のコードを以下のように実装するしか思いつかない。(再帰脳無しだってもっとましに書けるよ、、と思う方多いでしょうが、、)
def product( ary, &blk ) idx_original = [] idx = [] ary.each_with_index do |a,i| idx_original[i] = idx[i] = a.size end yield(plot( idx, ary )) while !allone?(idx) idx.size.times do |i| if (idx[i] -= 1) == 0 idx[i] = idx_original[i] next else yield(plot(idx,ary)) break end end end end def plot(idx,ary) res = [] ary.each_with_index do |a,i| res+=[a[idx[i]-1]] end res end def allone?(ary) res = ary[0] ary.each do |a| if res != a return false end end return true end product([['q1'],[1,2],['q2'],['a','b'],['q3'],[1,3,5]]) do |x| p x end