【发布时间】:2021-05-31 00:43:45
【问题描述】:
我正在尝试使用递归函数遍历数组的所有可能排列。 排列不需要存储在内存中。它们正在被递归函数立即处理。
这个想法是递归函数有一个参数'used'跟踪递归树中此时'固定'的元素,还有一个参数'free'跟踪不存在的元素此时已修复(即它们将在从那里向下树的递归步骤中重新排列)。所以第一次,函数是用一个空的'used'数组和一个完整的'free'数组调用的。
不知何故,我下面的代码还不能工作。它只成功处理了第一个排列。
const elements = [7, 23, 41, 65, 99]
const n = elements.length;
handlePermutations([], elements);
function handlePermutations(used, free) {
if (used.length<n) {
for (i = 0; i < free.length; i++) {
newUsed = used.concat(free[i]); // add element i from free to used
newFree = free.filter(x => x != free[i]) // remove element i from free
handlePermutations(newUsed, newFree);
}
} else {
// ... 'process' this permutation (do something useful with it) ...
}
}
【问题讨论】:
-
你有想要的结果的例子吗?
-
真的有必要每次迭代都调用
handlePermutations吗?for不是已经这样做了吗? -
@NinaScholz,好吧.. 在这种情况下 [7, 23, 41, 65, 99] 的所有可能排列。但我不会把它们都写在这里。
-
@Peladao 我想你会发现this Q&A 很有用
-
我喜欢这个问题产生的各种答案!
标签: javascript algorithm recursion permutation