Неожиданный вывод функции Javascript - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь написать функцию, которая может выполнять перестановку.

Например, если я введу [1, 2, 3], ожидаемый ответ будет

[ [ 3, 2, 1 ], [ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ] ]

Но вместо того, чтобы показать ответ, он возвращает [[ ],[ ],[ ],[ ],[ ]]

Есть идеи?

var permute = (nums) => {
    results = [];

    var backtrack = (nums, result) => {
        if (nums.length === result.length) {
            results.push(result);
        } else {

            for (var i = 0; i < nums.length; i++) {
                if (result.indexOf(nums[i]) > -1) {
                    continue;
                }
                result.push(nums[i]);
                backtrack(nums, result);
                result.pop();
            }
        }
    }
    backtrack(nums, []);
    return results;

};

console.log(permute([1, 2, 3]));

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Просто Другой подход, использующий reverse (), особый случай перестановки, который OP приводит в качестве примера:

var arr = [ [ 3, 2, 1 ], [ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ] ];

var permuted = arr.map((num) => {

    return num.reverse();

});

console.log(permuted);
0 голосов
/ 15 мая 2018

Вы можете взять локальную копию result, разрезав этот массив, чтобы предотвратить использование той же ссылки на объект в наборе результатов.

var permute = (nums) => {
    var results = [];
    var backtrack = (nums, result) => {
        if (nums.length === result.length) {
            results.push(result.slice());           // push copy
        } else {
            for (var i = 0; i < nums.length; i++) {
                if (result.indexOf(nums[i]) > -1) {
                    continue;
                }
                result.push(nums[i]);
                backtrack(nums, result);
                result.pop();
            }
        }
    };
  
    backtrack(nums, []);
    return results;
};

console.log(permute([1, 2, 3]).map(a => a.join(' ')));

Версия без нажатия и выталкивания.

var permute = (nums) => {
    var results = [];
    var backtrack = (nums, result) => {
        if (nums.length === result.length) {
            results.push(result);
        } else {
            for (var i = 0; i < nums.length; i++) {
                if (result.indexOf(nums[i]) > -1) {
                    continue;
                }
                backtrack(nums, result.concat(nums[i])); // use a new array
            }
        }
    };
  
    backtrack(nums, []);
    return results;
};

console.log(permute([1, 2, 3]).map(a => a.join(' ')));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...