
在 javascript 递归算法中,将二维数组直接 push 到结果集会导致所有元素最终变为初始状态(如全 -1),根本原因是数组被按引用传递,需手动创建独立副本。
在 javascript 递归算法中,将二维数组直接 push 到结果集会导致所有元素最终变为初始状态(如全 -1),根本原因是数组被按引用传递,需手动创建独立副本。
当你在递归函数 solve 中执行 solutions.push(matrix) 时,JavaScript 并未复制数组内容,而是将 matrix 的引用(reference) 存入 solutions 数组。这意味着 solutions 中存储的每一个“矩阵”,实际上都指向内存中同一块地址——即最外层传入的那个 matrix 实例。随着递归回溯执行 matrix[row][col] = -1,该原始矩阵被不断还原,最终所有已“保存”的矩阵引用都同步反映为全 -1 状态。
✅ 正确做法是:在确认找到一个完整解(即 !nextEmpty 成立)时,立即创建 matrix 的深拷贝(至少是二维浅拷贝),再推入 solutions:
if (!nextEmpty) {
console.log(matrix);
// 创建二维数组的独立副本:对每一行调用 slice() 实现行级浅拷贝
const copy = matrix.map(row => [...row]); // 或 row.slice()
solutions.push(copy);
}⚠️ 注意事项:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- matrix.slice() 仅复制第一层数组(即行引用),无法解决嵌套数组问题,不适用;
- JSON.parse(JSON.stringify(matrix)) 可实现深拷贝,但会丢失非序列化值(如 undefined、函数、NaN、Infinity),且性能较差,不推荐用于纯数字矩阵场景;
- 对于二维数字数组,map(row => [...row]) 是最简洁、高效、语义清晰的方案(ES6+);
- 若矩阵含更深层嵌套或特殊类型,应使用 structuredClone()(现代环境支持)或成熟库如 Lodash 的 _.cloneDeep()。
? 总结:JavaScript 中对象(包括数组)默认按引用传递。在递归、回溯、缓存等需要保留中间状态的场景中,务必显式拷贝数据结构——不是“多此一举”,而是避免隐蔽 bug 的关键实践。
立即学习“Java免费学习笔记(深入)”;

















