排列組合 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 ) */

One Response to “排列組合 Combination for PHP”
你好~~
請問一下
如果要將重複的去除掉(ex:aaa、aab)
要怎麼做???
@菜鳥學習者
不好意思,你指的重複是…?aaa因為有a有兩個以上?aab也有兩個以上?所以叫重複是嗎?
如果是這樣的話,你可以參考這個網址http://202.193.64.35/dept7/acm/web/AlgorithmGossip/AlgorithmGossip.htm中的「集合問題」,希望你能找你想要的答案
回應(Leave a Reply)