Hatena::Groupvim

デカルト積

デカルト積

別名: Cartesian product / 直積集合 / カルテシアン積

function CartesianProduct(lists)
  if empty(a:lists)
    return []
  endif

  let result = [ [] ]
  for l in a:lists
    let temp = []
    for r in result
      let temp += map(copy(l), 'add(copy(r), v:val)')
    endfor
    let result = temp
  endfor

  return result
endfunction

実行例:

:echo CartesianProduct([ [0, 1], [2, 3, 4] ])

[ [0, 2], [0, 3], [0, 4], [1, 2], [1, 3], [1, 4] ]

* はてなダイアリーキーワード:デカルト積