首页 > php代码 > PHP中简单实现数学组合算法

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

随意转载^^但请附上教程地址。

标签:foreach

相关文章

发表留言