比如,有一组数字:1,2,3,4( 不一定是4个,可能是5个,8个,但这数字不重复)如果排出3个(可能是2个,上面的数字增多,可能要求是6个,7个)不同的组合:结果是:
1,2,3
1,2,4
2,3,4大家列下算法啊。

解决方案 »

  1.   

    全排列算法
    递归有层数限制,所以根据所谓高效率的10移动法写了个
    不知道效率如何,LZ拿去测试一下。
    function combination($numArr,$combineLen)
    {
    $numCt = count($numArr);
    if($combineLen > $numCt) return;
    //$bin = decbin((pow(2,$combineLen) - 1) << ($numCt - $combineLen));
    $bin = str_pad('',$combineLen,'1');
    $bin = str_pad($bin,$numCt,'0',STR_PAD_RIGHT);
    $find = $bin;
    $rs[] = implode(' ',array_slice($numArr,0,$combineLen));
    $j = 1;
    while(strrev($find) != $bin)
    {
    $k = explode('10',$find,2);
    $find = $find{0} === '0' ? strrev($k[0]).'01'.$k[1] : $k[0].'01'.$k[1];
    for($i=0;$i<$numCt;$i++) $rs[$j] .=  $find[$i] ?  $numArr[$i] . " " : '';
    $j++;
    }
    return $rs;
    }
    $a  = range(1,9);
    print_r(combination($a,4));