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)
这是实现这一目标的最快方法吗?有没有办法加快速度?也许以递归方式写出来?
我认为问题是计算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)