PHP全排列算法实现程序代码

作者:袖梨 2022-06-24

简介

如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)邻位对换法

实现全排列算法

 代码如下 复制代码

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."
";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D');
$b=array();
$range=wholerange($a,$b,$a);
$count=recursionarray($range);
echo "总共有".$count."排列";
?>

相关文章

精彩推荐