【问题标题】:Generating permutations from arrays从数组生成排列
【发布时间】:2014-12-06 12:52:17
【问题描述】:

我尝试将一个从 answer 生成排列的函数移植到 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 238 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);

我做错了什么?

【问题讨论】:

    标签: php arrays algorithm


    【解决方案1】:

    如果你使用 $s[] = $o;在您的递归函数中,它将为每个数字切片您的数组。 您可以添加一个“结果”参数,它将您的结果集保存为一个数组。 注意 & 符号。没有它,参数就不能“写”,只能“读”。

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

    【讨论】:

    • 谢谢你的回答,但这不是我想要做的,实际上我在我的问题中的意思是我希望每个结果都是一个数组,其中元素是数字/项目例如:数组 ( [0] => 1 [1] => 3 [2] => 7 ) 数组 ( [0] => 1 [1] => 3 [2] => 8 ) 数组 ( [0] = > 1 [1] => 4 [2] => 7 ) 等等
    • 好的,感谢您提供预期的结果。我编辑了我的帖子以获得它。
    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2016-10-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多