簡體   English   中英

爬樓梯並在 JavaScript 中一次找到所有可能的樓梯組合,1 和 2

[英]Climbing Stairs and finding all possible combinations of stairs, 1 and 2 at a time in JavaScript

在其他語言中有很多有用的線程,但我很難在 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));

這是動態規划的典型例子。 整個問題的解決方案取決於子問題的解決方案,子問題的解決方案也取決於子問題,依此類推。 一個特定的子問題可能需要計算不止一次,所以上面你展示的第一次計算時將它存儲在一個數組中,所以下次需要該值時,它只需要一個恆定時間的數組索引查找。

這可以幫助您理解:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM