2012-05-02 9 views
-2

これをPerlで計算する既存の実装はありますか?PerlでnCkをインラインで効率的に実装する

nCk (n choose k), or n!/(k!*(n-k!)) 

これは数値のみを返し、組み合わせのリストは返しません。

+7

なぜ非CPANが重要なのでしょうか?あなたはいつでもCPAN上の何かのソースを見ることができます。 –

+0

[CPAN](http://cpan.org)にない場合、それは存在しません。 –

答えて

5

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()); 
} 
+0

'Math :: BigInt'はすでに' bnok() 'でこの機能を提供しています。 'Math :: BigInt-> new($ n) - > bnok($ k)'となります。 'bfac()'ルーチンを自分で呼び出す必要はありません – ardnew

関連する問題