-1

是否有任何现有的实现可以在 Perl 中计算这个?

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

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

4

1 回答 1

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());
}
于 2012-05-02T01:00:52.707 回答