我在一个关于排列的算法上遇到了一点问题,我在全栈溢出中找到了它。
function permutator(inputArr) {
var results = [];
function permute(arr, memo) {
var cur, memo = memo || [];
for (var i = 0; i < arr.length; i++) {
cur = arr.splice(i, 1);
if (arr.length === 0) {
results.push(memo.concat(cur));
}
permute(arr.slice(), memo.concat(cur));
arr.splice(i, 0, cur[0]);(what's the purpose of this statement ????)
}
return results;
}
return permute(inputArr);
}实际上,我不明白递归调用是如何工作的,我不明白在这个递归调用中拼接方法是如何工作的,我的意思是,举个例子,让我们在每次迭代中运行cur = arr.splice(i,1)时,取一个由0,1, 2,3,4,5,6,7组成的数组,通常我们得到cur =0,然后cur =2,然后4,然后6,依此类推,所以当我在控制台中记录memo和arr变量时,我得到了这个enter image description here
发布于 2021-11-12 05:11:16
这是一个复杂的方法来解决这类问题,为了理解这一点,我们需要简化问题,
经过一些修改后,这段代码的可读性更好!
function permutator(inputArr) {
var results = [];
function permute(arr, memo = []) {
for (var i = 0; i < arr.length; i++) {
let temp = [...arr], mem = memo.concat(temp.splice(i, 1));
if (temp.length === 0) results.push(mem);
permute(temp, mem);
}
}
permute(inputArr);
return results
}
console.log(permutator([1, 2, 3]))
因此,基本上在原始代码中,它们修改arr (仅在很短的时间内),然后(在本行中为arr.splice(i, 0, cur[0]);)恢复回其原始状态。
splice方法接受3个参数(start, deleteCount?, ...items?),并返回一个包含已删除元素的数组。我建议你多读一些关于Array.splice()的文章,
示例:
let numbers = [1, 2, 3, 4, 5];
console.log({ numbers })
let deleted_elements = numbers.splice(0, 2);
console.log('Removing first 2 elements from `numbers`', { deleted_elements, numbers })
numbers.splice(0, 0, ...deleted_elements);
console.log("Push `deleted_elements` in there original place", { numbers })
https://stackoverflow.com/questions/69937474
复制相似问题