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

标签 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 [ [], [], [], [], [] ]

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

最佳答案

您的代码自始至终都在使用一个 数组,并将它插入该数组的所有条目弹出。在保存到 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;
}

关于javascript - Array.push 正在推送一个空数组而不是我传递给它的完整数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49021686/

相关文章:

java - Eclipse 在获取 session 代码时暂停且没有断点

debugging - 如何使用 GDB 或 LLDB 等调试器在 Rust 中调试 crate?

javascript - 将字符串数组转换为浮点型,然后求转换后数组的平均值

javascript - 如何获取用户创建的输入的用户文本输入的值,jQuery

javascript - `element.removeEventLister` 和 `element = null` 之间有什么区别?

javascript - 使用 JavaScript/jquery 复制 url 并粘贴到桌面、ios 和 android 上的剪贴板按钮

delphi - Delphi map 文件中的双点 ..

delphi - 我的组件崩溃(TCustomEdit 后代)

django - 如何在 Debug模式下停止sql日志记录?

javascript - 如何获取文本域中多个选择框的选中值。我用的是select js库