排列组合的实现 发表于 2017-08-10 | 分类于 算法 | | 阅读次数: 字数统计: 396 字 | 阅读时长 ≈ 2 分钟 PHP实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778<?php// 阶乘function factorial($n){ return array_product(range(1,$n));}// 排列数function A($n,$m){ return factorial($n)/factorial($n-$m);}// 组合数function C($n,$m){ return A($n,$m)/factorial($m);}/** * 排列 * @param array $a * 要排列的数构成的数组 * @param int $m * @return array * 返回所有的排列情况 */function arrangement($a, $m) { $r = array(); $n = count($a); if ($m <= 0 || $m > $n) { return $r; } for ($i=0; $i<$n; $i++) { $b = $a; $t = array_splice($b, $i, 1); if ($m == 1) { $r[] = $t; } else { $c = arrangement($b, $m-1); foreach ($c as $v) { $r[] = array_merge($t, $v); } } } return $r;}/** * 组合 * @param array $a * 要组合的数构成的数组 * @param int $m * @return array * 返回所有的组合情况 */function combination($a, $m) { $r = array(); $n = count($a); if ($m <= 0 || $m > $n) { return $r; } for ($i=0; $i<$n; $i++) { $t = array($a[$i]); if ($m == 1) { $r[] = $t; } else { $b = array_slice($a, $i+1); $c = combination($b, $m-1); foreach ($c as $v) { $r[] = array_merge($t, $v); } } } return $r;} JavaScript实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657/** * 创建范围为low至high的连续数组 * range(1,10)等同于php中的range方法 => [1,2,3,4,5,6,7,8,9,10] * @param low * @param high * @returns {Array} */function range(low, high) { let arr = []; while (low <= high) { arr.push(low++); } return arr;}/** * 数组元素乘积 * 等同php中的array_product * @param arr * @returns {*} */function array_product(arr) { return arr.reduce((pre, cur) => { return pre * cur; } );}/** * 阶乘 * @param n * @returns {*} */function factorial(n) { return array_product(range(1, n));}/** * 排列数 * @param n * @param m * @returns {number} */function A(n, m) { return factorial(n) / factorial(n - m);}/** * 组合数 * @param n * @param m * @returns {number} */function C(n, m) { return A(n, m) / factorial(m);}