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

//================================
//  從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
)
*/

低溫烘培 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • Eric
  • Bug report:

    A + C + B 不見了
  • 文章有提到這個排列組合程式是取不重複的組合,所以A+ C + B與A+ B + C 算是同一種,所以應該不是bug

    低溫烘培 於 2009/09/13 16:23 回覆