これをPerlで計算する既存の実装はありますか?PerlでnCkをインラインで効率的に実装する
nCk (n choose k), or n!/(k!*(n-k!))
これは数値のみを返し、組み合わせのリストは返しません。
これをPerlで計算する既存の実装はありますか?PerlでnCkをインラインで効率的に実装する
nCk (n choose k), or n!/(k!*(n-k!))
これは数値のみを返し、組み合わせのリストは返しません。
Math::Countingは、必要な機能を定義しています。あなたはどの 外部モジュールなしでコピーして、次を貼り付けて、それを使用することができます。
sub combination {
my($n, $r) = @_;
return unless defined $n && $n =~ /^\d+$/ && defined $r && $r =~ /^\d+$/;
my $product = 1;
while($r > 0) {
$product *= $n--;
$product /= $r--;
}
return $product;
}
しかし、任意精度のために、あなたはMath::BigIntを使用する必要があります。繰り返しますが、Math::Countingの機能を使用することができます。
sub bcomb {
my($n, $k) = @_;
$n = Math::BigInt->new($n);
$k = Math::BigInt->new($k);
my $r = $n - $k;
return $n->bfac()/($k->bfac() * $r->bfac());
}
'Math :: BigInt'はすでに' bnok() 'でこの機能を提供しています。 'Math :: BigInt-> new($ n) - > bnok($ k)'となります。 'bfac()'ルーチンを自分で呼び出す必要はありません – ardnew
なぜ非CPANが重要なのでしょうか?あなたはいつでもCPAN上の何かのソースを見ることができます。 –
[CPAN](http://cpan.org)にない場合、それは存在しません。 –