PHP中简单实现数学组合算法
组合数公式是指从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号c(n,m) 表示,下面我们来看用php来实现。
公式
有时候也表示成:
c(n,m)=p(n,m)/m!=n!/((n-m)!*m!)
2性质
c(n,m)=c(n,n-m);
3递推公式
c(n,m)=c(n-1,m-1)+c(n-1,m)
等式左边表示从n个元素中选取m个元素,而等式右边表示这一个过程的另一种实现方法:任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的分成两类情况,即m个被选择元素包含了特殊元素和m个被选择元素不包含该特殊元素。
<?php //实现数学上的组合数算法 header("content-type:text/html;charset=utf-8"); /** * 在数组$a中任意m个元素组合 * * @param array $a 候选的集合 * @param int $n 候选的集合大小 * @param int $m 组合元素大小 * @param array $b 储存当前组合中的元素,这里储存的是元素键值 * @param int $M 相当一个常量,一直保持不变 * @return */ function combine($a, $n, $m, $b, $M) { for ($i = $n; $i >= $m; $i--) { $b[$m - 1] = $i - 1; if ($m > 1) { $combine[] = combine($a, $i - 1, $m - 1, $b, $M); } else { $onecombine = ''; for ($j = $M - 1; $j >= 0; $j--) { $onecombine.= $a[$b[$j]]; } $combine[] = $onecombine; $onecombine = ''; } } return $combine; } /** * 递归输出数组 * * @param array $arr 待输出的数组 * @return int 返回数组元素个数 */ function recursionarray($arr) { $i = 0; foreach ($arr as $value) { if (is_array($value)) { $i+= recursionarray($value); } else { echo $value . "<br/>"; $i++; } } return $i; } $a = array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' ); $b = array(); $combine = combine($a, 10, 5, $b, 5); $count = recursionarray($combine); echo "总共有" . $count . "组合"; ?>
文章网址:http://www.phprm.com/code/75705.html
随意转载^^但请附上教程地址。