我试图了解如何回溯工作在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)
}
}
型
也许这是一个简单的问题,但为什么函数循环两次或三次弹出?它取决于执行的帧数?然后;索引取决于什么?
谢谢你们!
1条答案
按热度按时间hof1towb1#
最后,我找到了一种理解它的方法,我找到了一个网站,你可以用python写一段代码,你可以检查每一个堆栈,检查每一个堆栈上发生了什么。
这是网站:
https://pythontutor.com/
同样的代码,但在python中:
字符串