写一个更快的组合算法

Gio*_*gio 4 php algorithm recursion combinatorics

我试图写一个组合数学算法得到的所有可能的组合k出来的n不重复.

公式是:

n!/(k!(n-k)!)); 
Run Code Online (Sandbox Code Playgroud)

结果以数组结尾.我实际写的是这样的:

function Factorial($x)
{
    if ($x < 1)
    {
        echo "Factorial() Error: Number too small!";
    )

    $ans = 1;
    for ($xx = 2; $xx >= $x; $xx++)
    {
        $ans = $ans * $xx;
    }

    return($ans);
}

function Combination($selectcount,$availablecount)
{
    $ans = Factorial($availablecount) / (
        Factorial($availablecount - $selectcount) * Factorial($selectcount)
    );

    return ($ans);
}
Run Code Online (Sandbox Code Playgroud)

这是实现这一目标的最快方法吗?有没有办法加快速度?也许以递归方式写出来?

FUD*_*FUD 6

我认为问题是计算C(n,k),这可以在不计算阶乘的情况下完成,诀窍是首先要注意

C(n,k) = (n*(n-1)...(n-k+1)) / (1*2*...*k) = (n/1)*(n-1/2)*...(n-k+1/k)
Run Code Online (Sandbox Code Playgroud)

也为了效率

C(n,k) = C(n,n-k), therefore choose which ever is smaller k or n-k
Run Code Online (Sandbox Code Playgroud)

如果有错误,请随意编辑,因为我已经从C转换它,我不知道PHP

function nCk($n, $k)
{
    if( $n-$k<$k )
        $k = $n-$k;
    $ans = 1;
    for( $i=1; $i<=$k; ++$i )
    {
        $ans = ($ans*($n-$i+1))/$i;
    }
    return $ans;
}
Run Code Online (Sandbox Code Playgroud)