再帰脳

再帰をパッと思いつけるのは、そいういう脳の仕組みだから、、だと思う。再帰脳ではない私は、上記のコードを以下のように実装するしか思いつかない。(再帰脳無しだってもっとましに書けるよ、、と思う方多いでしょうが、、)

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