试图通过这个简单的例子来理解backtranking在php上是如何工作的

fcy6dtqo  于 5个月前  发布在  PHP
关注(0)|答案(1)|浏览(58)

我试图了解如何回溯工作在php。我明白的理论,但我不明白的代码。
这是一个简单的例子:

function permute($nums)
{
    $result = array();
    backTracking($nums, count($nums), 0, array(), $result);
    return $result;
}

function backTracking($nums, $numsLength, $startIndex, $permutation, &$result)
{

    if (count($permutation) == $numsLength) {
        array_push($result, $permutation);
        print_r("return" . "\n");
        return;
    }

    for ($i = $startIndex; $i < $numsLength; $i++) {
        if (!in_array($nums[$i], $permutation)) {
            array_push($permutation, $nums[$i]);
            print_r($i . "\n");
            print_r($permutation);
            backTracking($nums, $numsLength, 0, $permutation, $result);
            print_r('pop : ' . array_pop($permutation) . "\n");
        }
    }
}

$nums = [1, 2, 3];
var_dump(permute($nums));

字符串
结果:

0
Array
(
    [0] => 1
)
1
Array
(
    [0] => 1
    [1] => 2
)
2
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
return
pop : 3
pop : 2
2
Array
(
    [0] => 1
    [1] => 3
)
1
Array
(
    [0] => 1
    [1] => 3
    [2] => 2
)
return
pop : 2
pop : 3
pop : 1
1
Array
(
    [0] => 2
)
0
Array
(
    [0] => 2
    [1] => 1
)
2
Array
(
    [0] => 2
    [1] => 1
    [2] => 3
)
return
pop : 3
pop : 1
2
Array
(
    [0] => 2
    [1] => 3
)
0
Array
(
    [0] => 2
    [1] => 3
    [2] => 1
)
return
pop : 1
pop : 3
pop : 2
2
Array
(
    [0] => 3
)
0
Array
(
    [0] => 3
    [1] => 1
)
1
Array
(
    [0] => 3
    [1] => 1
    [2] => 2
)
return
pop : 2
pop : 1
1
Array
(
    [0] => 3
    [1] => 2
)
0
Array
(
    [0] => 3
    [1] => 2
    [2] => 1
)
return
pop : 1
pop : 2
pop : 3
array(6) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [1]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(3)
    [2]=>
    int(2)
  }
  [2]=>
  array(3) {
    [0]=>
    int(2)
    [1]=>
    int(1)
    [2]=>
    int(3)
  }
  [3]=>
  array(3) {
    [0]=>
    int(2)
    [1]=>
    int(3)
    [2]=>
    int(1)
  }
  [4]=>
  array(3) {
    [0]=>
    int(3)
    [1]=>
    int(1)
    [2]=>
    int(2)
  }
  [5]=>
  array(3) {
    [0]=>
    int(3)
    [1]=>
    int(2)
    [2]=>
    int(1)
  }
}


也许这是一个简单的问题,但为什么函数循环两次或三次弹出?它取决于执行的帧数?然后;索引取决于什么?
谢谢你们!

hof1towb

hof1towb1#

最后,我找到了一种理解它的方法,我找到了一个网站,你可以用python写一段代码,你可以检查每一个堆栈,检查每一个堆栈上发生了什么。
这是网站:
https://pythontutor.com/
同样的代码,但在python中:

def find_nums(numbers: list, target: int) -> list:
    def find_num(start: int, target: int, combination: list):
        if target == 0:
            result.append(combination[:])
            return
        if target < 0 or target == len(numbers):
            return
        for index in range(start, len(numbers)):
            if index > start and numbers[index] == numbers[index-1]:
                continue
            combination.append(numbers[index])
            find_num(index + 1, target - numbers[index], combination)
            combination.pop()
    result = []
    find_num(0, target, [])
    return result

print(find_nums([1,2,3,5], 6))

字符串

相关问题