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)鄰位對換法
實現全排列演算法
| 代碼如下 |
|
| 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."排列"; ?> |
http://www.bkjia.com/PHPjc/941716.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/941716.htmlTechArticlePHP全排列演算法實現程式碼 從n個不同元素中任取m(mn)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當...