zoukankan      html  css  js  c++  java
  • PHP 实现数学问题:组合

    需求:

    有一个数组 ['a', 'b', 'c', 'cd']

    需要从数组中取出任意 m 个不重复的元素,列出所有的可能性(也不需要出现重复的组合例如['a', 'b' ,'c'] 和 ['a', 'c', 'b'])。

    可以使用递归来完成:

    <?php
    
    function getCombinationToString($arr, $m) {
    	if ($m == 1) {
    	   return $arr;
    	}
    	$result = [];
    	
    	$tmpArr = $arr;
    	unset($tmpArr[0]);
    	for($i = 0; $i < count($arr); $i++) {
    		$s = $arr[$i];
    		$ret = getCombinationToString(array_values($tmpArr), ($m - 1), $result);
    		foreach($ret as $row) {
    			$val = $s . ',' . $row;
    			$val = explode(',', $val);
    			sort($val);
    			$val = implode(',', $val);
    			if(! in_array($s, explode(',', $row)) && ! in_array($val, $result)) {
    				$result[] = $val;
    			}
    		}
    	}   
      return $result;
    }
    
    $arr = ['a', 'b', 'c', 'cd'];
    
    $t = getCombinationToString($arr, 3);
    echo '<pre>';print_r($t);
    

    如果允许包含重复的组合,把 line:17 的条件注释即可。  

    输出:

    Array
    (
        [0] => a,b,c
        [1] => a,b,cd
        [2] => a,c,cd
        [3] => b,c,cd
    )
    

      

    方法二、

    <?php
    
    $words = array('a', 'b', 'c');   
    
    $num = count($words); 
    
    $total = pow(2, $num);
    
    for ($i = 0; $i < $total; $i++) {  
        for ($j = 0; $j < $num; $j++) { 
            if (pow(2, $j) & $i) echo $words[$j] . ' ';      
        } 
        echo '<br />'; 
    }
    

      

  • 相关阅读:
    C# 使用布尔操作符
    C# 复合赋值操作符
    C# while语句
    C# do while语句
    datatabe 与string
    打开外部程序并
    group by 显示
    GROUP by 方法  C#
    屏幕取色
    C#简单继承示例详解——快速入门
  • 原文地址:https://www.cnblogs.com/dee0912/p/5605559.html
Copyright © 2011-2022 走看看