我试图将一个从这个答案生成排列的函数移植到PHP,结果如下:
function recurse($s, $arrs, $k) {
if ($k === count($arrs)) {
echo $s.' ';
} else {
foreach ($arrs[$k] as $o) {
recurse($s.$o, $arrs, $k + 1);
}
}
}
这给了我正确的输出
137 138 147 148 237 247 248
现在我想把输出作为一个数组,而不是字符串,但在编辑之后,由于某种原因,我得到了错误的结果:
function generatePermutations($s, $arrs, $k) {
if ($k === count($arrs)) {
print_r($s);
} else {
foreach ($arrs[$k] as $o) {
$s[] = $o;
generatePermutations($s, $arrs, $k + 1);
}
}
}
输出:
阵列([0]=>1[1] =>3[2] =>7)大堆([0]=>1[1] =>3[2] =>7[3] =>8)大堆([0]=>1[1] =>3[2] =>4[3] =>7)大堆([0]=>1[1] =>3[2] =>4[3] =>7[4] =>8)大堆([0]=>1[1] =>2[2] =>3[3] =>7)大堆([0]=>1[1] =>2[2] =>3[3] =>7[4] =>8)大堆([0]=>1[1] =>2[2] =>3[3] =>4[4] =>7)大堆([0]=>1[1] =>2[2] =>3[3] =>4[4] =>7[5] =>8)
这是两个功能的输入
$in = array( array(1, 2), array(3, 4), array(7, 8) );
recurse("", $in, 0);
generatePermutations(array(), $in, 0);
我做错了什么?
如果使用$s[]=$o;在递归函数中,它会为每个数字对数组进行切片。您可以添加一个"result"参数,它将把您的结果集保存为一个数组。注意&符号。没有它,参数就不是"可写的",只有"可读的"。
$in = array( array(1, 2), array(3, 4), array(7, 8) );
$result = array();
generatePermutations("", $in, 0, $result);
print_r($result);
function generatePermutations($s, $arrs, $k, &$result) {
if ($k === count($arrs)) {
$result[] = $s;
} else {
foreach ($arrs[$k] as $o) {
generatePermutations($s.$o, $arrs, $k + 1, $result);
}
}
}
输出:
Array
(
[0] => 137
[1] => 138
[2] => 147
[3] => 148
[4] => 237
[5] => 238
[6] => 247
[7] => 248
)
编辑:修改以获得Robotex的预期输出:
$in = array( array(1, 2), array(3, 4), array(7, 8) );
$result = array();
$s = array();
generatePermutations($s, $in, 0, $result);
print_r($result);
function generatePermutations(&$s, $arrs, $k, &$result) {
if ($k === count($arrs)) {
array_push($result, $s);
} else {
foreach ($arrs[$k] as $o) {
array_push($s, $o);
generatePermutations($s, $arrs, $k + 1, $result);
array_pop($s);
}
}
}
输出:
Array
(
[0] => Array
(
[0] => 1
[1] => 3
[2] => 7
)
[1] => Array
(
[0] => 1
[1] => 3
[2] => 8
)
[2] => Array
(
[0] => 1
[1] => 4
[2] => 7
)
[3] => Array
(
[0] => 1
[1] => 4
[2] => 8
)
[4] => Array
(
[0] => 2
[1] => 3
[2] => 7
)
[5] => Array
(
[0] => 2
[1] => 3
[2] => 8
)
[6] => Array
(
[0] => 2
[1] => 4
[2] => 7
)
[7] => Array
(
[0] => 2
[1] => 4
[2] => 8
)
)