Я пытаюсь заставить этот алгоритм кучи возвращать массив перестановок вместо печати, как показано ниже. Я знаю, что это можно сделать, объявив массив вне функции и нажав на него, но я хочу избежать этого подхода. Как я могу заставить это вернуть массив перестановок без использования внешнего массива?
function heaps(arr, n) {
if (n === undefined) n = arr.length;
if (n <= 1) console.info(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]];
}
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто сделайте 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 явными параметрами вспомогательной функции.
Спасибо! Первый был тем, что я искал. Я боролся с удалением слоев массива, которые возвращались из рекурсивных вызовов.
Объявите массив и вспомогательную функцию внутри внешней функцией.