萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP全排列算法實現程序代碼

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);

copyright © 萬盛學電腦網 all rights reserved