php Array N Combinations仅适用于N = 6,我需要N = 10

时间:2015-04-19 09:46:30

标签: php arrays

此代码,工作正常,最多6种组合。如果我用10个组合调用该函数,如下所示:print_r(combinationsOf_FUNQ(10,$ array));它提供了一个白页,而控制台也是白色的。任何想法为什么会发生这种情况?

    for ($z = 1; $z <= 20; $z++) {
   $array[]=$z;
} 

function combinationsOf_FUNQ($n, $array){

        if ($n === 0)
            return array(array());

        if (count($array) === 0)
            return array();

        $x = $array[0];

        $TEMP = array_slice($array,1,count($array)-1);

        $res1 = combinationsOf_FUNQ($n-1,$TEMP);

            for ($i = 0; $i < count($res1); $i++) {
                array_splice($res1[$i], 0, 0, $x);
            }

        $res2 = combinationsOf_FUNQ($n,$TEMP);

        return array_merge($res1, $res2);
    }

echo'<pre>';
print_r(combinationsOf_FUNQ(6,$array));
echo'</pre>';

2 个答案:

答案 0 :(得分:2)

与此网站名称相同:) 堆栈溢出许多递归。你真的可以扩展大小,但你再次达到n = 15的极限值。

....在这里,你是我的解决方案 - 没有递归程序。你必须要注意的是,现在数组的主要索引并不是顺序的,但无论如何,子数组都是有序的,并且可以由foreach以正确的方式进行。 我也使用了内存扩展,因为数组看起来非常大。

<?php
 for ($z = 1; $z <= 20; $z++) {
   $array[]=$z;
}
ini_set('memory_limit',-1);

$n=10;
$res=array();
for($k=0;$k<$n;$k++){
    $res[0][$k]=-1;
}

for($i=0;$i<$n;$i++){
    foreach($res as $key=>$row){
        if($row[$i]==-1){
            foreach($array as $aa){
                $ft=true;
                for($j=0;$j<$i;$j++){
                    if($row[$j]>=$aa){
                        $ft=false;
                        break;
                    }
                }
                if($ft){
                    $tmp=array();
                    for($k=0;$k<$n;$k++){
                        if($k<$i){
                            $tmp[$k]=$row[$k];
                        }
                        elseif($k==$i){
                            $tmp[$k]=$aa;
                        }
                        else {
                            $tmp[$k]=-1;
                        }
                    }
                    $res[]=$tmp;
                }
            }
        }
    }
    foreach($res as $key=>$row){
        if($row[$i]==-1){
            unset($res[$key]);
        }
    }
}


$ii=0;
foreach($res as $row){
    $ii++;
    echo $ii." => ( ";
    foreach ($row as $a){
        echo $a.' ';
    }
    echo ")<br/>";
}
?>

答案 1 :(得分:0)

我已经尝试过你的代码,当我尝试6时它工作正常但是当我尝试10时它给了我

Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 72 bytes) in /opt/lampp/htdocs/test/index.php on line 43

所以当我使用ini_set('memory_limit', '-1');超过内存时。 它工作正常,但需要一些时间才能完成运行