2 независимых события 3 раза - перечислить возможные результаты - PullRequest
1 голос
/ 14 декабря 2011

Я оглянулся, но не смог найти ничего подходящего для этого.

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

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Ключ здесь - рекурсивный вызов.

<?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 голосов
/ 14 декабря 2011

Это то, что вы хотите?

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