Index / Reload / Edit

Comment on 2005-08-20

お名前:
E-mail or URL:
コメント:
* 2005-08-20 23:10:59

おおーう、わざわざすみません。感謝感激雨霰でございますよ。

* K保 2005-08-20 22:40:30

見やすいコード
http://hosho.ees.hokudai.ac.jp/~kubo/log/2005/img08/combo.pl.txt
におきました.たびたびおさわがせしてすみません.

* K保 2005-08-20 22:07:44

いんでんとが全部なくなってしまった……
みぐるしくてすみません.嗚呼

* K保 2005-08-20 22:06:22

Perl だとこういう関数で OK だと思います.
use strict;
sub combo
{
my ($k, $array_orig) = @_;
my @array = @$array_orig; # copy
my @set;
if ($k == 1) {
@set = map { [$_] } @array;
}
else {
for (0 .. (scalar(@array) - $k)) {
my $head = shift @array;
my @copy = @array;
for my $s (@{&combo($k - 1, \@copy)}) {;
push @set, [$head, @$s];
}
}
}
return \@set;
}
実行例は
print join("\n", map { join(", ", @$_) } @{&combo(3, [1 .. 5])}), "\n";
とか
for my $s (@{&combo(4, [1 .. 8])}) {
print join(", ", @$s), "\n";
}
考えかたは &combo(3, [1 .. 4]) の場合
1-2-3
-4
3-4
2-3-4
という「木」を生成する,というものです.

* 2005-08-20 18:54:01

なるほど、Math::Combinatoricsなんてモジュールがあるんですね。Rだとgtoolsパッケージですか。
でもMath::Combinatoricsって標準添付モジュールではないですよね。RはともかくPerlでは徹底して非標準モジュールは使わないことにしている(Rを呼び出すのはもってのほか)ので困りましたねぇ。モジュールの中身でも読んでみますかね。

* K保 2005-08-20 12:31:16

Perl で組み合わせ列挙やるのはこんなかんぢでしょうか
use Math::Combinatorics;
print join("\n", map { join(" ", @$_) } combine(3, (1 .. 5)));

* K保 2005-08-20 12:21:41

R だとすごく簡単です.
library(gtools)
combinations(5, 3) # 5 個の中から 3 個とる組み合わせすべて
以上

Powered by くっつき BBS