[英]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.