程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 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);
    $count=recursionarray($range);
    echo "總共有".$count."排列";
    ?>

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved