我正在尝试获取此模式:
[
[,,2],
[,2,1],
[2,1,0]
]
我尝试了以下代码:
let n = 3
let mainArr = Array(n)
for (let i = 0; i < mainArr.length; i++) {
mainArr[i] = new Array(n)
}
let odi = 0; // stands for one dimensional index
let tdi = n - 1; // stands for two dimensional index
let diagonalValue = n - 1;
for (let i = 0; i < n; i++) {
recur(odi, tdi)
odi++;
tdi--;
diagonalValue--;
}
function recur(frst, scnd) {
if (mainArr[frst] === undefined || mainArr[scnd] === undefined) {
return
} else {
mainArr[frst][scnd] = diagonalValue;
return recur(frst + 1, scnd - 1)
}
}
console.log(mainArr);
但我得到了这个输出:
[
[,,2],
[,1,],
[0,,]
]
所以我认为在 for 循环中使用递归时我遗漏了一些关于递归的内容,因为我使用递归解决了许多问题,但只是以随意的方式而不在 for 循环中使用它。
你能解释一下当我们在 for
循环中使用递归函数时会发生什么吗?它是在每次迭代时调用自己还是 for 循环等待递归函数完成然后循环移动到下一次迭代?
答案 0 :(得分:0)
你可以使用一个函数来保存最后插入的数组。
function fill(n, array = Array(n + 1)) {
array = array.slice(1);
array.push(n);
return [array, ...(n ? fill(n - 1, array) : [])]
}
console.log(fill(2));
答案 1 :(得分:0)
您的尝试存在一些问题:
在 recur
中,您使用 scnd
作为外部维度的索引。那是该索引的错误维度。您应该将 if
条件更改为:
if (mainArr[frst] === undefined || mainArr[scnd] === undefined) {
为此:
if (mainArr[frst] === undefined || scnd < 0) {
在主程序中,您大概想调用 recur
来填充矩阵的对角线,但是 tdi
值不应在迭代之间改变:每个对角线都从同一列开始。>
所以这是您的代码,需要最少的更正:
let n = 3
let mainArr = Array(n)
for (let i = 0; i < mainArr.length; i++) {
mainArr[i] = new Array(n)
}
let odi = 0; // stands for one dimensional index
let tdi = n - 1; // stands for two dimensional index
let diagonalValue = n - 1;
for (let i = 0; i < n; i++) {
recur(odi, tdi)
odi++;
diagonalValue--;
}
function recur(frst, scnd) {
if (mainArr[frst] === undefined || scnd < 0) {
return
} else {
mainArr[frst][scnd] = diagonalValue;
return recur(frst + 1, scnd - 1)
}
}
console.log(mainArr);
当然,还有其他方法可以产生这种结果,通常更短。这里的递归可以很容易地转换为迭代,所以我不会在这里使用递归解决方案。
例如:
let n = 3;
let mainArr = [];
for (let row = 0; row < n; row++) {
mainArr[row] = [];
for (let i = 0; i <= row; i++) {
mainArr[row][n - 1 - row + i] = n - 1 - i;
}
}
console.log(mainArr);