排列組合 Combination for PHP

哈…很奇怪最近都會寫到該死的程式,這次要寫的是排列組合函式,比如說甲、乙、丙、丁四種東西,每種有無限個,取三種為一組的所有組合,例如「甲甲乙」和「乙甲甲」都是「二甲一乙」,這兩個組合內容是一樣的,只能算一種。害我又去翻了高職數字課本排列組合那篇,內容雖然都有公式,不過只是讓你知道如何算出「一共有幾種」而已,所以要把所有組合內容印出來,讓我頭有點大,不過最後還是有硬搞出來(總覺得應該用遞迴寫才對=_=|||)

//================================
//  從N種無限個取R種之任意不重複的組合
//================================
function Combination($array,$r,$join=' + '){
	$array = array_values($array);
	$n = count($array);
	if($n >= $r && $r != 0){
		$length = pow($n,$r-1)*$n;
		for($i=0; $i<$r; $i++){
			$flag = pow($n,$r-$i-1);
			for($j=0; $j<$length; $j++){
				if($flag == 1 ){
					$key=$j%$n;
				} else {
					$key=intval($j/$flag)%$n;
				}
				$x[$j][$i] = $array[$key];
			}
		}
		for($k=0; $k<$length; $k++){
			if(is_array($x)){
				sort($x[$k]);
			}	
			$x[$k] = implode ($join,$x[$k]);
		}
		return array_unique($x);
	} else {
		return array();
	}
}
//建立測試陣列
$array = array('A','B','C');
 
//從陣列中任取3個為一組不重複之組合
print_r(Combination($array,3));
 
/*
輸出結果:
Array (
    [0] => A + A + A
    [1] => A + A + B
    [2] => A + A + C
    [4] => A + B + B
    [5] => A + B + C
    [8] => A + C + C
    [13] => B + B + B
    [14] => B + B + C
    [17] => B + C + C
    [26] => C + C + C
)
*/
二月 26, 2008 • Posted in: PHP, 程式語言

One Response to “排列組合 Combination for PHP”

  1. 菜鳥學習者 - 四月 2, 2009

    你好~~
    請問一下
    如果要將重複的去除掉(ex:aaa、aab)
    要怎麼做???


    @菜鳥學習者
    不好意思,你指的重複是…?aaa因為有a有兩個以上?aab也有兩個以上?所以叫重複是嗎?
    如果是這樣的話,你可以參考這個網址http://202.193.64.35/dept7/acm/web/AlgorithmGossip/AlgorithmGossip.htm中的「集合問題」,希望你能找你想要的答案

回應(Leave a Reply)