我正在尝试使此堆算法返回一个排列数组,而不是如下所示进行打印。我知道可以通过在函数外部声明一个数组并推送到它来完成此操作,但是,我想避免这种方法。我该如何在不使用外部数组的情况下返回排列的数组?
function heaps(arr, n) {
if (n === undefined) n = arr.length;
if (n <= 1) console.log(arr);
else {
for (let i = 0; i <= n - 1; i++)
{
heaps(arr, n-1);
if
(n % 2 === 0) [arr[n-1], arr[i]] = [arr[i], arr[n-1]];
else
[arr[n-1], arr[0]] = [arr[0], arr[n-1]];
}
}
}
答案 0 :(得分:2)
只需使其return
作为数组结果,并从循环中的递归调用中收集返回值:
function heaps(arr, n = arr.length) {
if (n <= 1) return [arr.slice()];
let result = [];
for (let i = 0; i <= n - 1; i++) {
result.push(...heaps(arr, n-1));
if (n % 2 === 0)
[arr[n-1], arr[i]] = [arr[i], arr[n-1]];
else
[arr[n-1], arr[0]] = [arr[0], arr[n-1]];
}
return result;
}
或者,创建一个内部辅助函数,将其执行推入外部数组
function heaps(arr) {
let result = [];
function helper(n) {
if (n <= 1)
result.push(arr.slice());
else
for (let i = 0; i <= n - 1; i++) {
heaps(n-1);
if (n % 2 === 0)
[arr[n-1], arr[i]] = [arr[i], arr[n-1]];
else
[arr[n-1], arr[0]] = [arr[0], arr[n-1]];
}
}
helper(arr.length);
return result;
}
如果您不使用“外部”数组坚持,请创建result
数组和辅助函数的输入arr
显式参数。