Array.push正在推送一个空数组而不是我传递给它的完整数组

时间:2018-02-28 03:52:01

标签: javascript debugging

我正在为攀爬楼梯算法编写解决方案 提示具体是:

'你需要爬上一个有n个台阶的楼梯,你决定通过跳上台阶来进行一些额外的锻炼。您可以在一次跳跃中覆盖最多k个步骤。返回所有可能的跳跃序列,你可以采取爬上楼梯,排序。'

我的代码工作 - 我使用了回溯,它应该以正确的顺序出现除了......每当我将一个解决方案推入我的答案数组时,就会推送一个空数组。我控制台登录以查看被推入我的阵列的内容,并且它是一个具有正确值的完整数组。我无法理解这是怎么回事。这是我的代码:

function climbingStaircase(n, k) {
  const solutions = [];

  const findSolution = (progressArray, k, remaining) => {
      if (remaining === 0) {
          console.log('pA:', progressArray)
          solutions.push(progressArray);
          return;
      } else {
          for (let i = 1; i <= k; i++){
             if (i <= remaining) {
                progressArray.push(i);
                findSolution(progressArray, k, remaining - i);
                progressArray.pop();
              }
          }
      }
  }
  findSolution([], k, n);
  console.log('final solutions', solutions)
}

输入n = 4且k = 2,这就是我的控制台的样子:

pA: [ 1, 1, 1, 1 ]
pA: [ 1, 1, 2 ]
pA: [ 1, 2, 1 ]
pA: [ 2, 1, 1 ]
pA: [ 2, 2 ]
final solutions [ [], [], [], [], [] ]

我尝试过分配临时变量,以确保它始终引用正确的数组。我已经尝试将我的解决方案数组作为我传入的参数...所有这些似乎都是不必要的,并且仍然返回相同的结果。我知道它的小东西会让我翻白眼,但我看不到它。请帮忙。

2 个答案:

答案 0 :(得分:3)

您的代码始终使用一个数组,并弹出它推入该数组的所有条目。保存到solutions时,您可能希望保存数组的副本

solutions.push(progressArray.slice());
// -------------------------^^^^^^^^

直播示例:

function climbingStaircase(n, k) {
  const solutions = [];

  const findSolution = (progressArray, k, remaining) => {
      if (remaining === 0) {
          console.log('pA:', progressArray)
          solutions.push(progressArray.slice());
          return;
      } else {
          for (let i = 1; i <= k; i++){
             if (i <= remaining) {
                progressArray.push(i);
                findSolution(progressArray, k, remaining - i);
                progressArray.pop();
              }
          }
      }
  }
  findSolution([], k, n);
  console.log('final solutions', solutions)
}
climbingStaircase(4, 2);
.as-console-wrapper {
  max-height: 100% !important;
}

答案 1 :(得分:1)

solutions.push(progressArray);替换为solutions.push(progressArray.slice());

您正在将progressArray传递给您的函数,然后您正在改变它。但由于这与progressArray的引用始终相同,因此您正在改变相同的数组。最终,progressArray.pop();将删除所有元素,最终会得到相同空数组的五倍。

.slice()会创建数组的副本。