Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unexpected output of Javascript function

I'm trying to write a function that can perform permutation.

For example, if I input [1, 2, 3], the expected answer will be

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

But instead of showing the answer, it returns [[ ],[ ],[ ],[ ],[ ]]

Any ideas?

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]));
like image 311
johnhckuo Avatar asked May 15 '18 12:05

johnhckuo


1 Answers

You could take a local copy of result by slicing this array to prevent the same object reference in the result set.

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(' ')));

A version without pushing and popping.

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(' ')));
like image 77
Nina Scholz Avatar answered Nov 08 '22 12:11

Nina Scholz