2011-12-14 1 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

+0

Что это значит? Формула: # возможные события = k^n. – KingBOB

+0

, но ваш пример всегда (мощность 2) + 1, не забывайте, что индексный индекс массива всегда начинается с 0. – ajreal

ответ

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);