PHP全排列算法實現(xiàn)程序代碼

字號:


    從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當(dāng)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公式
    全排列數(shù)f(n)=n!(定義0!=1)
    遞歸算法
    1,2,3
    1,3,2
    2,1,3
    2,3,1
    3,2,1
    3,1,2
    這是由于算法只是考慮到了如何輸出全排列,而沒有考慮到換位是否有問題。所以我提出了解決方案,就是換位函數(shù)修改下
    如 1 2 3 換位的話 ,不應(yīng)該直接 3 2 1這樣 ,讓3和1直接換位; 而是讓3排在最前后 ,1 2 依次向后
    基本算法
    以下介紹全排列算法四種:
    (A)字典序法
    (B)遞增進(jìn)位制數(shù)法
    (C)遞減進(jìn)位制數(shù)法
    (D)鄰位對換法
    實現(xiàn)全排列算法
    代碼如下
    <?php
    header("content-type:text/html;charset=utf-8");/**
    * @param array $a 待排列的元素集合,會動態(tài)變化
    * @param array $b 儲存當(dāng)前排列
    * @param array $M 待排列的元素集合,相當(dāng)于一個常量,始終為初始待排列的元素集合
    */
    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;
    }
    /**
    * 遞歸輸出數(shù)組
    *
    * @param array $arr 待輸出的數(shù)組
    * @return int 返回數(shù)組元素個數(shù)*/
    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."排列";
    ?>