我正在研究矩阵算法,但早期遇到了问题。
我有以下数组:
[ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ]
我想将其转化为:
[ [ 0, 0, 0 ], [ 0, 9, 0 ], [ 0, 0, 0 ] ]
我试图像这样设置中间值:
array[1][1] = 9
在一个孤立的环境中,这很好用。但是,在我的递归循环的上下文中,它无法正常工作,而是最终结果:
[ [ 0, 9, 0 ], [ 0, 9, 0 ], [ 0, 9, 0 ] ]
所以我的问题是我的程序出错了哪里?
function matrix(n, array = initArrays(n), i = 0, j = 0) {
if (i > 0) {
return array // <--- returns: [ [ 0, 9, 0 ], [ 0, 9, 0 ], [ 0, 9, 0 ] ]
}
array = addDigit(n, array, i, j)
return matrix(n, array, i + 1, j)
}
function initArrays(n) {
const array = []
const subArray = []
for (let i = 0; i < n; i++) {
subArray.push(0)
}
for (let i = 0; i < n; i++) {
array.push(subArray)
}
return array
}
function addDigit(n, array, i, j) {
// array = [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] // <--- uncommenting this line fixes the problem. Why?
array[1][1] = 9
return array
}
matrix(3)
这是我的程序的简化版本。它目前只重复一次,并设置3x3网格的中间值(忽略j
,它用于未来的功能)。
可以在这里看到:
不工作:我想要解决的问题 https://repl.it/repls/AttentiveWideOrder
工作:黑客解决方案 https://repl.it/repls/CuteSoggyArchitects
黑客解决方案的工作方式是在尝试分配中间值之前立即手动重置阵列。我不知道为什么这会产生任何不同,并会感谢任何可以指出我的错误的人。
感谢。
答案 0 :(得分:2)
您需要将独立数组推送到外部数组。 Javascript使用对象引用,并将相同的引用推送到外部数组。
function initArrays(n) {
const array = []
const subArray = []
for (let i = 0; i < n; i++) {
subArray.push(0)
}
for (let i = 0; i < n; i++) {
array.push(subArray.slice()); // get copy of primitive values
}
return array
}
var array = initArrays(3);
array[1][1]= 9;
console.log(array);