哈…很奇怪最近都會寫到該死的程式,這次要寫的是排列組合函式,比如說甲、乙、丙、丁四種東西, 每種有無限個,取三種為一組的所有組合,例如「甲甲乙」和「乙甲甲」都是「二甲一乙」,這兩個組合內容是一樣的,只能算一種。害我又去翻了高職數字課本排列組合那篇,內容雖然都有公式,不過只是讓你知道如何算出「一共有幾種」而已,所以要把所有組合內容印出來,讓我頭有點大,不過最後還是有硬搞出來(總覺 得應該用遞迴寫才對=_=|||)
//================================ // 從N種無限個取R種之任意不重複的組合 //================================ function Combination($array,$r,$join=' + '){ $n = count($array); if($n >= $r){ $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++){ 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 ) */
全站熱搜
留言列表