我正在嘗試使用 JS 解決簡單的演算法:
給定兩個數字 n 和 k,你必須從 1…n 中找出 k 個數字的所有可能組合。
Input : n = 5
k = 3
Output : 1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
但是,當我使用 JS 嘗試此代碼時,我沒有得到預期的輸出:
let ans = [],
arr = [];
function makeCombination(n, k, low = 1) {
if (k == 0) {
ans.push(arr);
console.log(...arr);
return;
}
for (let i = low; i <= n; i ) {
arr.push(i);
makeCombination(n, k - 1, i 1);
arr.pop();
}
return ans;
}
var n = 5;
var k = 3;
makeCombination(n, k);
輸出:
1 2 3
1 2 4
1 2 5
你能幫忙嗎,為什么我沒有得到預期的輸出?我將不勝感激您的任何幫助。
uj5u.com熱心網友回復:
除了在函式之外使用一些其他變數之外,您還可以使用一個回傳單個陣列的函式。
function makeCombination(n, k, i = 1) {
const result = [];
while (i <= n - k 1) {
if (k === 1) result.push([i]);
else result.push(...makeCombination(n, k - 1, i 1).map(a => [i, ...a]));
i ;
}
return result;
}
makeCombination(5, 3).map(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
let ans = [],
arr = [];
function makeCombination(n, k, low = 1) {
if (k == 0) {
ans.push(arr.slice());
// console.log(...arr); commenting out the console log to demonstrate that the returned value is correct
return;
}
for (let i = low; i <= n; i ) {
arr.push(i);
makeCombination(n, k - 1, i 1);
arr.pop();
}
return ans;
}
var n = 5;
var k = 3;
makeCombination(n, k).map(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }
您需要復制部分結果陣列。否則,您將對同一陣列的參考推送到結果陣列,并在回溯演算法期間從中洗掉元素。
問題的一個明顯跡象是您的函式將正確的結果寫入控制臺,但回傳的結果陣列填充了空陣列。使用slice()您制作副本可以避免此問題。
編輯:復制 Nina Scholz 的控制臺格式化技術,因為它看起來好多了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/368419.html
標籤:javascript 算法 组合
