2015-04-19 61 views
0

此代碼工作良好,最多可使用6種組合。如果我用10個組合調用函數,如下所示:print_r(combinationsOf_FUNQ(10,$ array));它提供了一個白頁,控制檯也是白色的。任何想法爲什麼發生這種情況?php Array N Combinations僅適用於最多N = 6,我需要N = 10

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>'; 
+0

添加錯誤報告給您的文件(S)的頂部,你能告訴我們,如果你得到任何錯誤:'' – Rizier123

回答

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/>"; 
} 
?> 
+0

謝謝,正是我將限制改爲128M,最多可以達到n = 7,但之後我不得不將其更改爲256M。有沒有一種方法來改進代碼,以便更高效? – Sebastian

+0

是的,我認爲,如果我們刪除遞歸。讓我試試 - 給我幾個小時,因爲我剛醒來,必須先取得一些東西。 –

+0

我看過它,但沒有遞歸解決它意味着以絕對不同的方式解決。你能否向我解釋一下任務的情況。 1.它是否將n個數組中這20個數字的所有獨特組合結合起來? 2.如果結果順序很重要? –

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');超過內存。 它工作正常,但需要一些時間才能完成運行