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]));
修正说明
- 创建数组副本:用
[...cur]或cur.slice()生成当前cur的独立副本,再推入result,这样每个排列都会被单独保存,不会被后续回溯操作修改。 - 过滤已选元素:添加
if (cur.includes(nums[i])) continue;,确保每个元素只会被选中一次,生成符合要求的不重复排列。
运行修正后的代码,就能得到你预期的所有排列结果了。
内容的提问来源于stack exchange,提问作者Vignesh Chandrasekharan
相关产品推荐
相关产品推荐

