全ての組み合わせ
Posted feedbacks - Groovy
再帰で。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | def cross_product(List[] lists) {
if(lists.size() == 0) {
return [[]]
} else {
return cross_product_2(cross_product(*cdr(lists)), lists[0])
}
}
def cross_product_2(xs,ys) {
xs.inject([]) { xval, x ->
ys.inject(xval) { yval ,y ->
yval + [[y, *x]]
}
}
}
def cdr(xs) {
if(xs.size() < 2) {
return []
} else {
return xs[1..-1]
}
}
println cross_product([1,2,3],[4,5],[6,7])
|
やはり再起処理で解くのが スタンダードでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | def crossProduct( params ){
def result = []
switch(params.size()){
case 1:
// 何もしない
break;
case 2:
params[0].each{ item1 ->
params[1].each{ item2 ->
result << ([] + item1) + ([] + item2)
}
}
break;
default:
result = crossProduct( [crossProduct(params[0..1])] + params[2..-1])
break;
}
result
}
crossProduct([[1,2,3,4], ["a", "b", "c"], ["あ", "い"]]).each{
println it
}
crossProduct([[1,2,3,4], "abc"]).each{
println it
}
|


zigorou #3400() Rating0/0=0.00
Pythonで表現すると下のようになります。
順番はこの通りでなくても構いません。返すものはリストと書きましたが、 なんらかの「一度に全部をメモリ上に作成しないリスト状のモノ」がある言語ではそちらを使う方がおすすめです。 数値や文字列を一つのリストに混在させるのがやっかいな言語では整数のリストに限定しても構いません。このお題はZIGOROuさんとのやりとりにヒントを得て作りました。 (しまった、先にブログで公開されてしまった→Yet Another Hackadelic - 直積の導出と考えうる全ての値を網羅したハッシュの生成)
追記:サンプル出力が間違っていたのでoceanさんの解答を使って出力し直しました。
[ reply ]