因此,基本前提是給定“n”個樓梯,找到一次走 1 步或 2 步的所有可能組合。由于我花了很多時間學習如何用遞回解決斐波那契數列,我立即注意到這兩個問題之間的相似之處。我想出了如何解決組合數量的問題……但是在試圖弄清楚如何輸出每個可能的組合時,我完全陷入困境。
這是我想出的解決方案......
function countWaysToReachNthStair(n) {
if (n === 1) { return 1; }
if (n === 2) { return 2; }
return countWaysToReachNthStair(n-1) countWaysToReachNthStair(n-2)
}
console.log(countWaysToReachNthStair(4));
每次我嘗試向輸出的陣列中添加內容時,我都會收到錯誤訊息。任何提示或技巧將不勝感激...
呼叫的預期結果
countWaysToReachNthStair(4)
將是
5 ((1, 1, 1, 1), (1, 1, 2), (2, 1, 1), (2, 2))
uj5u.com熱心網友回復:
您可以將總步數和到步的路線計算為:
const result = [];
function countWaysToReachNthStairHelper(n, arr) {
if (n === 1) {
result.push(arr.join("") "1");
return 1;
}
if (n === 2) {
const str = arr.join("");
result.push(str "1" "1");
result.push(str "2");
return 2;
}
arr.push(1);
const first = countWaysToReachNthStairHelper(n - 1, arr);
arr.pop();
arr.push(2);
const second = countWaysToReachNthStairHelper(n - 2, arr);
arr.pop();
return first second;
}
function countWaysToReachNthStair(n) {
return countWaysToReachNthStairHelper(n, []);
}
console.log(countWaysToReachNthStair(4));
console.log(result);
uj5u.com熱心網友回復:
或多或少按照 OP 的理解,步驟是 1 到 n-1 的所有步驟,以及 2 到 n-1 的所有步驟
function waysToReachNthStair(n) {
if (n === 1) return [[1]];
if (n === 2) return [[2], [1,1]];
return [
...waysToReachNthStair(n-1).map(way => [1, ...way]),
...waysToReachNthStair(n-2).map(way => [2, ...way])
]
}
console.log(waysToReachNthStair(4));
uj5u.com熱心網友回復:
生成器非常適合處理組合和排列的問題 -
function* ways(n) {
if (n <= 0) return
if (n <= 2) yield [n]
for (const w of ways(n - 2)) yield [2, ...w]
for (const w of ways(n - 1)) yield [1, ...w]
}
for (const w of ways(4))
console.log(`(${w.join(",")})`)
(2,2)
(2,1,1)
(1,2,1)
(1,1,2)
(1,1,1,1)
如果您對總數感興趣,可以將所有方式收集到一個陣列中并讀取length結果的屬性 -
console.log(Array.from(ways(4)).length)
5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360686.html
標籤:javascript 递归 组合
上一篇:附加不同風格的文字
