FC2ブログ
最初
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/CombinationGenerator1.txt

修正1 6/9
http://blog-imgs-36.fc2.com/a/m/a/amamiyaprog/CombinationGenerator2.txt

修正2 7/2

# 組合せ生成 Combination Generator
# 引数 N個 R個 値 ($N, $R, \@Value)
# 戻り値 組合せ生成 (@Combination)
sub COMBINATIONGENERATOR{
my ($N, $R, $Value) = @_;
my @Combination = ();
my @TempCombination = ();
my @Position = ();
my $PossibleToMove = 0;
my $CurrentPosition = 0;
my $CombinationPosition = 0;
$N = int($N);
$R = int($R);
my $R1 = $R - 1;
my $Count = @$Value;

# 個数と配列数の確認
if(($N <= 0) || ($R <= 0) || ($N < $R) || ($N > $Count)){
return 0;
}

if($R == 1){
return @$Value;
}

# 初期化 Initialization
for(my $i = 0; $i < $R; $i++){
$Position[$i] = -1;
}

for(my $i = 0; $i <= $N - $R; $i++){
# 現在位置
$Position[0] = $i;

# 順列の値
$TempCombination[0] = $$Value[$i];

# 配列の位置
$CurrentPosition++;

while($CurrentPosition > 0){
# 移動可能 Possible to Move
$PossibleToMove = &PossibleToMove(($N - ($R - $CurrentPosition)), $CurrentPosition, \@Position);

if($PossibleToMove != -1){
# 配列の位置
$Position[$CurrentPosition] = $PossibleToMove;
# 順列の値
$TempCombination[$CurrentPosition] = $$Value[$Position[$CurrentPosition]];

if($CurrentPosition == $R1){
# 組合せ生成 Combination Generator
$Combination[$CombinationPosition] = join(" ", @TempCombination);

# 組合せ生成 配列の位置
$CombinationPosition++;
}else {
# 配列の位置
$CurrentPosition++;
}
}else {
# 配列情報を削除 Delete Position
$Position[$CurrentPosition] = -1;

# 配列の位置
$CurrentPosition--;
}
}
}

return @Combination;
}

# 移動可能 Possible to Move
# 引数 限度 配列の位置 使用できない位置 (($Limit, $CurrentPosition, \@Position)
# 戻り値 移動可能な位置 ($PossibleToMove)
sub PossibleToMove{
my ($Limit, $CurrentPosition, $Position) = @_;
my $PossibleToMove = -1;

if(($$Position[$CurrentPosition] + 1) <= $Limit){
if($$Position[$CurrentPosition] <= $$Position[$CurrentPosition - 1]){
$PossibleToMove = $$Position[$CurrentPosition - 1] + 1;
}else {
$PossibleToMove = $$Position[$CurrentPosition] + 1;
}
}

return $PossibleToMove;
}


一言
組合せ数はこちら
perlで順列・組合せ 1 組合せ (Combination: COMBINATION): perlで順列・組合せ: 一寸先は闇
値の重複は無視する

修正1
値を2度代入していたので削除
1度目

for(my $j = $Start; $j <= $DiffR2; $j++){
$BetweenValue[$j] = $$Value[$BetweenValuePos[$j]];
}


2度目 これを削除

$BetweenValue[$j] = $$Value[$BetweenValuePos[$j]];

$BetweenValue[$k] = $$Value[$BetweenValuePos[$k]];


修正2
一からソースコードを書き直す
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS