二项分布是数学的概念,定义及公式定理不在此说明.
注:递归版第三步及递推都依赖于C(M-1,N-1)+C(M-1,N)=C(M,N)的变形
递归版:
(我给递归版注释了1 2 3 是为了解析非递归版(递推版)中同等的操作
1 2 3)方便我们理解是怎么让递归变成递推的
function binomial($N,$k,$p)
{
// 1
if($N < 0 || $k < 0)
return 0.0;
//2
if($N == 0 && $k == 0)
return 1.0;
//3
return (1.0 - $p) * binomial($N - 1,$k,$p) + $p * binomial($N - 1,$k - 1,$p);
}
非递归版:
function binomial($N,$k,$p)
{
if ($N < 0 || $k < 0)
return 0.0;
//1
$ret[0][0] = 1.0;
//2
for ($i = 1; $i < $N + 1; ++$i)
$ret[$i][0] = (1.0 - $p) * $ret[$i - 1][0];
for ($j = 1; $j < $k + 1; ++$j)
$ret[0][$j] = 0.0;
//3
for ($i = 1; $i < $N + 1; ++$i)
for ($j = 1; $j < $k + 1; ++$j)
$ret[$i][$j] = (1.0 - $p) * $ret[$i - 1][$j] + $p * $ret[$i - 1][$j - 1];
return $ret[$N][$k];
}
运行: