javascript - for循环内部的递归让我感到困惑
问题描述
我正在尝试获得这种模式:
[
[,,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 循环等待递归函数完成然后循环移动到下一次迭代?
解决方案
您的尝试存在一些问题:
在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);
推荐阅读
- java - findViewById 方法有问题
- javascript - 如何在单击时从状态数组中删除值
- node.js - 如何使用在其代码中执行另一个库的 bin 的 NPM 库?
- python-3.x - Kivy recycleview 重复数据项
- javascript - JQuery/JS 选择特定元素
- c++ - malloc 和 std::allocator 的区别
::分配 - python - 改变一个矩阵,使得只有列表被改变,而不是 Python 中的整个矩阵
- react-native - 自定义 Victory Scatter 的 dataComponent 使用图标代替 React Native 中的默认圆圈
- javascript - React JS:CCAvenue 支付集成
- codenameone - 无限进度隐藏完整的android屏幕