【发布时间】:2021-08-16 08:08:56
【问题描述】:
nums splice 和 temp pop 操作在第一次返回条件后运行两次。为什么?我已经在 console.log 中输出了所有内容以便理解,但无法得到以下打印两次的原因::
::new after rec call:: i:: 0 temp:: [ 1, 2, 3 ] nums:: []
after rec call:: temp:: [ 1, 2 ] nums:: [ 3 ]
outside for loop:: [ 1, 2 ] nums:: [ 3 ]
::new after rec call:: i:: 0 temp:: [ 1, 2 ] nums:: [ 3 ]
after rec call:: temp:: [ 1 ] nums:: [ 2, 3 ]
据我了解,由于返回条件,它可以在返回后执行一次操作,因为流程将返回到调用函数的行。 对此的解释将不胜感激。
const combination = (nums) => {
let temp = []
let result = []
function backtracking(temp, nums) {
console.log("temp:: ", temp, " nums:: ", nums);
if (nums.length === 0) {
result.push([...temp])
console.log("::::: result.push:: temp:: ", temp, " nums:: ", nums);
return
}
for (let i = 0; i < nums.length; i++) {
console.log("::temp.push:: i:: ", i, " temp:: ", temp, " nums:: ", nums);
temp.push(nums[i]);
nums.splice(i, 1);
console.log("before rec call:: i:: ", i, " temp:: ", temp, " nums:: ", nums);
backtracking(temp, nums);
console.log("::new after rec call:: i:: ", i, " temp:: ", temp, " nums:: ", nums);
nums.splice(i, 0, temp.pop());
console.log("after rec call:: temp:: ", temp, " nums:: ", nums);
}
console.log("outside for loop:: ", temp, " nums:: ", nums);
}
console.log("before calling bakctracking:: ", temp, " nums:: ", nums);
backtracking(temp, nums)
console.log(" result:: ", result);
}
combination([1, 2, 3]);
以下是所有控制台日志的输出::
before calling bakctracking:: [] nums:: [ 1, 2, 3 ]
temp:: [] nums:: [ 1, 2, 3 ]
::temp.push:: i:: 0 temp:: [] nums:: [ 1, 2, 3 ]
before rec call:: i:: 0 temp:: [ 1 ] nums:: [ 2, 3 ]
temp:: [ 1 ] nums:: [ 2, 3 ]
::temp.push:: i:: 0 temp:: [ 1 ] nums:: [ 2, 3 ]
before rec call:: i:: 0 temp:: [ 1, 2 ] nums:: [ 3 ]
temp:: [ 1, 2 ] nums:: [ 3 ]
::temp.push:: i:: 0 temp:: [ 1, 2 ] nums:: [ 3 ]
before rec call:: i:: 0 temp:: [ 1, 2, 3 ] nums:: []
temp:: [ 1, 2, 3 ] nums:: []
::::: result.push:: temp:: [ 1, 2, 3 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 1, 2, 3 ] nums:: []//from this log --
after rec call:: temp:: [ 1, 2 ] nums:: [ 3 ]
outside for loop:: [ 1, 2 ] nums:: [ 3 ]
::new after rec call:: i:: 0 temp:: [ 1, 2 ] nums:: [ 3 ]
after rec call:: temp:: [ 1 ] nums:: [ 2, 3 ] // --to this log
::temp.push:: i:: 1 temp:: [ 1 ] nums:: [ 2, 3 ]
before rec call:: i:: 1 temp:: [ 1, 3 ] nums:: [ 2 ]
temp:: [ 1, 3 ] nums:: [ 2 ]
::temp.push:: i:: 0 temp:: [ 1, 3 ] nums:: [ 2 ]
before rec call:: i:: 0 temp:: [ 1, 3, 2 ] nums:: []
temp:: [ 1, 3, 2 ] nums:: []
::::: result.push:: temp:: [ 1, 3, 2 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 1, 3, 2 ] nums:: []
after rec call:: temp:: [ 1, 3 ] nums:: [ 2 ]
outside for loop:: [ 1, 3 ] nums:: [ 2 ]
::new after rec call:: i:: 1 temp:: [ 1, 3 ] nums:: [ 2 ]
after rec call:: temp:: [ 1 ] nums:: [ 2, 3 ]
outside for loop:: [ 1 ] nums:: [ 2, 3 ]
::new after rec call:: i:: 0 temp:: [ 1 ] nums:: [ 2, 3 ]
after rec call:: temp:: [] nums:: [ 1, 2, 3 ]
::temp.push:: i:: 1 temp:: [] nums:: [ 1, 2, 3 ]
before rec call:: i:: 1 temp:: [ 2 ] nums:: [ 1, 3 ]
temp:: [ 2 ] nums:: [ 1, 3 ]
::temp.push:: i:: 0 temp:: [ 2 ] nums:: [ 1, 3 ]
before rec call:: i:: 0 temp:: [ 2, 1 ] nums:: [ 3 ]
temp:: [ 2, 1 ] nums:: [ 3 ]
::temp.push:: i:: 0 temp:: [ 2, 1 ] nums:: [ 3 ]
before rec call:: i:: 0 temp:: [ 2, 1, 3 ] nums:: []
temp:: [ 2, 1, 3 ] nums:: []
::::: result.push:: temp:: [ 2, 1, 3 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 2, 1, 3 ] nums:: []
after rec call:: temp:: [ 2, 1 ] nums:: [ 3 ]
outside for loop:: [ 2, 1 ] nums:: [ 3 ]
::new after rec call:: i:: 0 temp:: [ 2, 1 ] nums:: [ 3 ]
after rec call:: temp:: [ 2 ] nums:: [ 1, 3 ]
::temp.push:: i:: 1 temp:: [ 2 ] nums:: [ 1, 3 ]
before rec call:: i:: 1 temp:: [ 2, 3 ] nums:: [ 1 ]
temp:: [ 2, 3 ] nums:: [ 1 ]
::temp.push:: i:: 0 temp:: [ 2, 3 ] nums:: [ 1 ]
before rec call:: i:: 0 temp:: [ 2, 3, 1 ] nums:: []
temp:: [ 2, 3, 1 ] nums:: []
::::: result.push:: temp:: [ 2, 3, 1 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 2, 3, 1 ] nums:: []
after rec call:: temp:: [ 2, 3 ] nums:: [ 1 ]
outside for loop:: [ 2, 3 ] nums:: [ 1 ]
::new after rec call:: i:: 1 temp:: [ 2, 3 ] nums:: [ 1 ]
after rec call:: temp:: [ 2 ] nums:: [ 1, 3 ]
outside for loop:: [ 2 ] nums:: [ 1, 3 ]
::new after rec call:: i:: 1 temp:: [ 2 ] nums:: [ 1, 3 ]
after rec call:: temp:: [] nums:: [ 1, 2, 3 ]
::temp.push:: i:: 2 temp:: [] nums:: [ 1, 2, 3 ]
before rec call:: i:: 2 temp:: [ 3 ] nums:: [ 1, 2 ]
temp:: [ 3 ] nums:: [ 1, 2 ]
::temp.push:: i:: 0 temp:: [ 3 ] nums:: [ 1, 2 ]
before rec call:: i:: 0 temp:: [ 3, 1 ] nums:: [ 2 ]
temp:: [ 3, 1 ] nums:: [ 2 ]
::temp.push:: i:: 0 temp:: [ 3, 1 ] nums:: [ 2 ]
before rec call:: i:: 0 temp:: [ 3, 1, 2 ] nums:: []
temp:: [ 3, 1, 2 ] nums:: []
::::: result.push:: temp:: [ 3, 1, 2 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 3, 1, 2 ] nums:: []
after rec call:: temp:: [ 3, 1 ] nums:: [ 2 ]
outside for loop:: [ 3, 1 ] nums:: [ 2 ]
::new after rec call:: i:: 0 temp:: [ 3, 1 ] nums:: [ 2 ]
after rec call:: temp:: [ 3 ] nums:: [ 1, 2 ]
::temp.push:: i:: 1 temp:: [ 3 ] nums:: [ 1, 2 ]
before rec call:: i:: 1 temp:: [ 3, 2 ] nums:: [ 1 ]
temp:: [ 3, 2 ] nums:: [ 1 ]
::temp.push:: i:: 0 temp:: [ 3, 2 ] nums:: [ 1 ]
before rec call:: i:: 0 temp:: [ 3, 2, 1 ] nums:: []
temp:: [ 3, 2, 1 ] nums:: []
::::: result.push:: temp:: [ 3, 2, 1 ] nums:: []
::new after rec call:: i:: 0 temp:: [ 3, 2, 1 ] nums:: []
after rec call:: temp:: [ 3, 2 ] nums:: [ 1 ]
outside for loop:: [ 3, 2 ] nums:: [ 1 ]
::new after rec call:: i:: 1 temp:: [ 3, 2 ] nums:: [ 1 ]
after rec call:: temp:: [ 3 ] nums:: [ 1, 2 ]
outside for loop:: [ 3 ] nums:: [ 1, 2 ]
::new after rec call:: i:: 2 temp:: [ 3 ] nums:: [ 1, 2 ]
after rec call:: temp:: [] nums:: [ 1, 2, 3 ]
outside for loop:: [] nums:: [ 1, 2, 3 ]
result:: [
[ 1, 2, 3 ],
[ 1, 3, 2 ],
[ 2, 1, 3 ],
[ 2, 3, 1 ],
[ 3, 1, 2 ],
[ 3, 2, 1 ]
]
【问题讨论】:
标签: javascript recursion combinations backtracking