zoukankan      html  css  js  c++  java
  • php实现排列组合

    php实现排列组合

    一、总结

    1、回溯:回溯的函数参数有些生疏了,记录递归的位置(pos或step),还要有东西(vis数组)来记录这个是否已经被访问

    2、php全局变量的使用 :外部定义的普通变量,函数内部定义global

    二、代码

    需求:php实现排列组合

    代码一:

     1 /**
     2  * 排列组合
     3  * 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合
     4  *
     5  * @param 需要排列的数组 $arr
     6  * @param 最小个数 $min_size
     7  * @return 满足条件的新数组组合
     8  */
     9 function pl($arr,$size=5) {
    10  $len = count($arr);
    11  $max = pow(2,$len);
    12  $min = pow(2,$size)-1;
    13  $r_arr = array();
    14  for ($i=$min; $i<$max; $i++){
    15   $count = 0;
    16   $t_arr = array();
    17   for ($j=0; $j<$len; $j++){
    18   $a = pow(2, $j);
    19   $t = $i&$a;
    20   if($t == $a){
    21    $t_arr[] = $arr[$j];
    22    $count++;
    23   }
    24   }
    25   if($count == $size){
    26   $r_arr[] = $t_arr;
    27   }
    28  }
    29  return $r_arr;
    30  }
    31 $pl = pl(array(1,2,3,4,5,6,7),5);
    32 var_dump($pl);

    代码二:

     1 <?php
     2 namespace appindexcontroller;
     3 
     4 use appindexcontrollerBase;
     5 
     6 class Exercise extends Base
     7 {
     8     public function index()
     9     {
    10         // return view('insert_array');
    11         $this->plzhDemo();
    12     }
    13 
    14     /**
    15      * php实现排列组合
    16      * 参数:传入数组 排列组合所取的位数 vis数组 ans数据用来记录每次的结果
    17      * 算法;递归(回溯)
    18      * 返回值:返回排列组合结果数组
    19      * @return [type] [description]
    20      */
    21     private $count1=0;
    22     public function plzh($arr,$n,$pos,$vis,$ans){
    23         //1、递归返回条件:位数够了就可以返回了
    24         if($pos>$n-1){
    25             global $count1;
    26             $count1++;
    27             dump($ans);
    28         }else{
    29             $len=count($arr);
    30             for ($i=0; $i < $len; $i++) { 
    31                 if($vis[$i]==0){//没取
    32                     $ans[$pos]=$arr[$i];
    33                     $vis[$i]=1;
    34                     $this->plzh($arr,$n,$pos+1,$vis,$ans);
    35                     $vis[$i]=0;
    36                 }
    37             }
    38         }
    39         //2、递归里面的算法(一位一位的来取)取一位之后,把这一位的数标记置为已经取了,然后取后面的位的时候从没有取的数里面取,所以需要标记数组
    40         //2.1、 从未取的数里面依次取一位就好
    41 
    42     }
    43     public function plzhDemo(){
    44         $arr=array(1,2,3,4,5,6,7);
    45         $n=5;
    46         $vis=array();
    47         for ($i=0; $i <=count($arr) ; $i++) { 
    48             $vis[$i]=0;
    49         }
    50         $ans=array();
    51         $this->plzh($arr,$n,0,$vis,$ans);
    52         global $count1;
    53         dump($count1);
    54     }
    55 
    56 }

    截图:

  • 相关阅读:
    20200721训练记录
    20200717训练记录
    打家劫舍III(力扣第337题)
    HBase API的删除数据操作的分析
    相交链表(第160题)
    删除排序链表中的重复元素(第83题)
    合并两个有序链表(力扣第21题)
    删除链表的倒数第N个节点(第19题)
    HBase的架构原理
    回文链表、链表求和(234、445)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8994232.html
Copyright © 2011-2022 走看看