【问题标题】:Climbing Stairs and finding all possible combinations of stairs, 1 and 2 at a time in JavaScript爬楼梯并在 JavaScript 中一次找到所有可能的楼梯组合 1 和 2
【发布时间】:2020-11-09 04:27:27
【问题描述】:

在其他语言中有很多有用的线程,但我很难在 JavaScript 中找到一个好的线程。下面的代码有效,但对于我来说,我无法弄清楚为什么。我了解递归的基础知识,但这个让我很难过。在我看来,resolve 的每个递归调用只会将结果总和放在一个与memory[n] 的最终调用无关的索引中。如果在 JavaScript 中有关于这个问题的其他资源,我也将不胜感激!

var climbStairs = function(n) {
  let result = resolve(n, []);
  return result;
};

function resolve(n, memory) {
  if (memory[n]) {
    return memory[n];
  }
  if (n == 0) {
    return 1;
  }
  if (n < 0) {
    return 0;
  }
  let result = resolve(n - 1, memory) + resolve(n - 2, memory);
  memory[n] = result;
  return result;
}

console.log(climbStairs(44));

【问题讨论】:

    标签: javascript algorithm recursion closures memoization


    【解决方案1】:

    这是动态规划的典型例子。整个问题的解决方案取决于子问题的解决方案,子问题的解决方案也取决于子问题,依此类推。一个特定的子问题可能需要计算不止一次,所以上面你展示的第一次计算时将它存储在一个数组中,所以下次需要该值时,它只需要一个恒定时间的数组索引查找。

    这可能有助于您理解:

    function resolve(n, memory) {
      if (memory[n]) {
        console.log(n, "already calculated");
        return memory[n];
      }
        console.log("calculating for", n);
      if (n == 0) {
        return 1;
      }
      if (n < 0) {
        return 0;
      }
      let result = resolve(n - 1, memory) + resolve(n - 2, memory);
      memory[n] = result;
      return result;
    }
    
    var climbStairs = function(n) {
      let result = resolve(n, []);
      return result;
    };
    
    climbStairs(10);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多