PHP全排列演算法實現程式碼

來源:互聯網
上載者:User

簡介

如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."排列";
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.