You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript排列算法代码为何返回空数组?数组引用传递疑问

问题:JavaScript排列算法返回空数组,数组引用传递的困惑

你提到的问题很典型,核心确实和JavaScript数组的引用特性有关,我来帮你一步步理清:

你的问题描述

给定一组不同的整数,返回所有可能的排列。例如输入[1,2,3],预期输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],但自己编写的代码返回结果为空,疑惑JavaScript数组是按引用传递,为何会出现这种情况?

你的原始代码

/**
 * @param {number[]} nums
 * @return {number[][]} 
 */
var permute = function(nums) {
    var result = [];
    helper(nums, result, []);
    return result;
};
var helper = function(nums, result, cur) {
    if (cur.length == nums.length) {
        result.push(cur);
    } else {
        for (let i = 0; i < nums.length; i++) {
            cur.push(nums[i]);
            helper(nums, result, cur);
            cur.pop();
        }
    }
}
console.log(permute([1, 2, 3]));

问题根源分析

你说得没错,JavaScript中的数组是引用类型,当你执行result.push(cur)时,并没有把当前cur数组的内容复制进去,而是把cur的引用地址存入了result。

后续的回溯操作(cur.pop())会不断修改这个引用指向的数组内容,当整个递归流程结束后,cur会被完全清空,所以result里的所有元素其实都指向同一个空数组,最终输出自然为空。

另外你的代码还有一个小问题:循环中没有判断当前元素是否已经被加入cur,会生成包含重复元素的无效排列(比如[1,1,1])。

修正后的代码

/**
 * @param {number[]} nums
 * @return {number[][]} 
 */
var permute = function(nums) {
    var result = [];
    helper(nums, result, []);
    return result;
};
var helper = function(nums, result, cur) {
    if (cur.length == nums.length) {
        // 创建cur的副本,避免引用共享
        result.push([...cur]);
        // 也可以用cur.slice()实现相同效果
        // result.push(cur.slice());
    } else {
        for (let i = 0; i < nums.length; i++) {
            // 过滤已选元素,避免重复添加
            if (cur.includes(nums[i])) continue;
            cur.push(nums[i]);
            helper(nums, result, cur);
            cur.pop();
        }
    }
}
console.log(permute([1, 2, 3]));

修正说明

  1. 创建数组副本:用[...cur]或cur.slice()生成当前cur的独立副本,再推入result,这样每个排列都会被单独保存,不会被后续回溯操作修改。
  2. 过滤已选元素:添加if (cur.includes(nums[i])) continue;,确保每个元素只会被选中一次,生成符合要求的不重复排列。

运行修正后的代码,就能得到你预期的所有排列结果了。

内容的提问来源于stack exchange,提问作者Vignesh Chandrasekharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:04:09