在Perl中高效内联实现nCk

时间:2012-05-02 00:58:38

标签: perl math

是否有任何现有的实现在Perl中计算?

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

只返回一个数字,而不是组合列表。

1 个答案:

答案 0 :(得分: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());
}