浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)

  1. /*分治法――直接选择
  2. 比如说a b c
  3. 首先将a之后的字符依次与a进行交换
  4. 1 b,a,c
  5. 2 c,b,a
  6. 注意这里少了一个原始数据 a,b,c。需要把原始数据也算如排列中
  7. 3 a,b,c
  8. 然后把字符移到第二个位置,将第二个位置之后的数分别与第二个位置的数进行交换
  9. 1 b,a,c ===> 11 b,c,a
  10. 2 c,b,a ===> 21 c,a,b
  11. 3 a,b,c ===> 31 a,c,b
  12. **/
  13. functionzuhe($arr,$begin){
  14. if(!is_array($arr))return;
  15. $N=count($arr);
  16. if($begin==$N-1 ||$begin>$N||$begin<0)return;
  17. if($begin== 0){
  18. print_r($arr);//输出原始数据
  19. echo''
  20. }
  21. //循环将初始值与第i个值交换后进行组合
  22. for($i=$begin;$i<$N;$i++){
  23. $t=$arr[$begin];
  24. $arr[$begin] =$arr[$i];
  25. $arr[$i] =$t;
  26. if($i!==$begin){//i==begin时的数已经输出过
  27. print_r($arr);
  28. echo''
  29. }
  30. zuhe($arr,$begin+1);
  31. $t=$arr[$begin];
  32. $arr[$begin] =$arr[$i];
  33. $arr[$i] =$t;
  34. }
  35. }
  36. $arr=array('a','b','c','d');
  37. //zuhe($arr,0);
  38. /*分治法――直接插入
  39. 初始时从0个元素开始,输出初始序列,为组合的一个序列
  40. 当在来一个元素时只需将该元素放在该元素之前的元素组的不同的位置即组成了不同的排列
  41. 如已有元素组为a,b.新元素为c,把c分别与a,b进行交换即可(a,c,b);(c,b,a),在现有的排列上在新增元素
  42. 重复执行以上步骤
  43. */
  44. functionzuhe2($arr,$begin){
  45. if($begin==0) {
  46. print_r($arr);
  47. echo"";
  48. //zuhe2($arr,$begin+1);
  49. }
  50. if($begin>=count($arr))return;
  51. zuhe2($arr,$begin+1);//begin时的排列上一次已产生,直接新增元素
  52. for($i=$begin-1;$i>=0;$i--){
  53. $t=$arr[$begin];
  54. $arr[$begin] =$arr[$i];
  55. $arr[$i] =$t;
  56. print_r($arr);
  57. echo"";
  58. zuhe2($arr,$begin+1);
  59. $t=$arr[$begin];
  60. $arr[$begin] =$arr[$i];
  61. $arr[$i] =$t; //phpfensi.com
  62. }
  63. }