Javascript函数的意外输出

joh*_*kuo 5 javascript arrays ecmascript-6

我正在尝试编写一个可以执行排列的函数.

例如,如果我输入[1, 2, 3],预期答案将是

[ [ 3, 2, 1 ], [ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ],[ 3, 2, 1 ] ]
Run Code Online (Sandbox Code Playgroud)

但它没有显示答案,而是返回 [[ ],[ ],[ ],[ ],[ ]]

有任何想法吗?

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]));
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 6

您可以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(' ')));
Run Code Online (Sandbox Code Playgroud)

没有推送和弹出的版本.

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(' ')));
Run Code Online (Sandbox Code Playgroud)