不明白 splice 方法在递归调用中如何工作以达到排列目的

Didn't understand how the splice method works in the recursion call for permutation purpose

我在全栈溢出中找到的关于排列的算法几乎没有问题

 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);
}

实际上,我不明白递归调用是如何工作的 我不明白 splice 方法在这个递归调用中是如何工作的我的意思是例如让我们在每次迭代中采用 [0,1,2,3,4,5,6,7] 的数组 运行 cur = arr.splice(i, 1) 通常我们得到 cur =0 然后 cur = 2,然后 4 然后 6 等等......,所以当我在控制台中记录备忘录和 arr 变量时,我得到了这个 enter image description here

解决这类问题的方法很复杂,为了理解这一点我们需要简化问题,

经过一些修改后,这段代码可读性更高!

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?),并且 return 包含已删除元素的数组。我建议您阅读有关 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 })