【问题标题】:Unexpected output of Javascript functionJavascript函数的意外输出
【发布时间】:2018-05-15 12:07:20
【问题描述】:

我正在尝试编写一个可以执行置换的函数。

例如,如果我输入[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]));

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

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

    【讨论】:

    • 谢谢!所以这是由于 js 中的对象和数组是通过引用传递的;因此,函数完成后results中的引用变为空对吗?
    • 正确。 otoh 你需要这个引用来操作pushpop,但仅限于实际函数内部。如果您将result.push(nums[i]); backtrack(nums, result); result.pop(); 替换为backtrack(nums, result.concat(nums[i]));,它就可以工作
    • 哇,没想到。谢谢,兄弟 ! :)
    【解决方案2】:

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

    【讨论】:

    • 逆向如何产生数据排列?
    • OP给出的预期响应是相反的。这是置换的一种特殊情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2021-07-31
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多