Javascript函数的输出结果不符合预期

5

我将尝试编写一个可以执行排列的函数。

例如,如果我输入[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个回答

5

您可以通过切片这个数组来获取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(' ')));


1
谢谢!这是因为 JavaScript 中的对象和数组是按引用传递的,因此在函数完成后,results 中的引用变为空了,对吗? - johnhckuo
正确。另一方面,您需要此参考来操作pushpop,但仅在实际函数内部。如果您只是用backtrack(nums, result.concat(nums[i]));替换result.push(nums[i]); backtrack(nums, result); result.pop();,它将起作用。 - Nina Scholz
哇,从没想过那个。谢谢伙计! :) - johnhckuo

0

另一种方法是使用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);

反转如何生成数据的排列? - Nina Scholz
OP预期的响应是一个反转。这是排列的一个特殊情况。 - Emeeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接