2011-12-14 44 views
1

我環顧四周,但找不到適合此用途的任何東西。2次獨立活動3次 - 列舉可能的結果

$n = 3;//number of events 
$k = array(0,1);//possible outcomes 

我想有一個包含所有可能結果的數組:

$result = array([0] => array(0,0,0), [1] => array(1,0,0)... [7] =>array(1,1,1)); 

我想,讓我沒有什麼可這漫長的和靜態的方法:

for($a=0;$a<count($k);$a++) { 
for($b=0;$b<count($k);$b++) { 
for($c=0;$c<count($k);$c++) { 
$push = array($a,$b,$c); 
array_push($result,$push); 
}}} 

如何我可以重新編寫這個函數來獲得一個將n值考慮在內的函數嗎?所以,如果我的$ N的值更改爲4我得到這樣一個數組:

$result = array([0] => array(0,0,0,0), [1] => array(1,0,0,0)... [15] =>array(1,1,1,1)); 
+1

陣列的數量應該是2次方,而不是(2次方)+1,否? – ajreal 2011-12-14 15:12:00

回答

3

這裏的關鍵是遞歸調用。

<?php 

function gen($n, $k) { 
     if ($n == 1) { 
       // Base case 
       $out = array(); 
       foreach ($k as $elem) { 
         array_push($out, array($elem)); 
       } 
       return $out; 
     } 

     $out = array(); 
     foreach ($k as $elem) { 
       // Recursive call 
       $prev = gen($n - 1, $k); 

       foreach ($prev as $rec) { 
         array_push($rec, $elem); 
         array_push($out, $rec); 
       } 
     } 
     return $out; 
}  

print_r(gen(4, array(0,1))); 

?> 

這將爲每次遞歸調用一次構建一個數組的圖層。

0

這是你想要的嗎?

$n = 3; 
$arr = array(); 
for ($i=0; $i<pow(2,$n); $i++) { 
    $s = str_pad(decbin($i), 3, "0", STR_PAD_LEFT); 
    $a = array_reverse(preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY)); 
    $arr[] = $a; 
} 
print_r($arr);