PHP全排列算法实现程序代码
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
简介
如1,2,3三个元素的全排列为:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
共3*2*1=6种 3!
2公式
全排列数f(n)=n!(定义0!=1)
递归算法
1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。所以我提出了解决方案,就是换位函数修改下
如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后
基本算法
以下介绍全排列算法四种:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法
实现全排列算法
<?php header("content-type:text/html;charset=utf-8"); /** * @param array $a 待排列的元素集合,会动态变化 * @param array $b 储存当前排列 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合 */ function wholerange($a, $b, $M) { $range = array(); if (count($a) > 1) { $d = $b; foreach ($a as $value) { $b[] = $value; $c = array_diff($M, $b); if (count($c) > 0) { $range[] = wholerange($c, $b, $M); } $b = $d; } } elseif (count($a) == 1) { foreach ($a as $value) { $b[] = $value; } $onerange = ""; foreach ($b as $value) { $onerange.= $value; } $range[] = $onerange; } return $range; } /** * 递归输出数组 * * @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' ); $b = array(); $range = wholerange($a, $b, $a); $count = recursionarray($range); echo "总共有" . $count . "排列"; ?>
教程网址:http://www.phprm.com/code/75708.html
欢迎收藏∩_∩但请保留本文链接。