繁体   English   中英

for循环内部的递归让我感到困惑

[英]Recursion inside for loop confuses me

我正在尝试获得这种模式:

[
  [,,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);

但我得到了这个 output:

[
  [,,2],
  [,1,],
  [0,,]
]

所以我认为在 for 循环中使用递归时我遗漏了一些关于递归的内容,因为我使用递归解决了许多问题,但只是以随意的方式而不在 for 循环中使用它。

您能否向我解释一下当我们在for循环中使用递归 function 时会发生什么。 它是与每次迭代一起调用自身还是 for 循环等待递归 function 完成然后循环移动到下一次迭代?

您可以使用 function 保留最后插入的数组。

 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));

您的尝试存在一些问题:

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);

当然,还有其他方法可以产生这种结果,通常更短。 这里的递归可以很容易地转换为迭代,所以对于这里的递归解决方案,我不会 go 。

例如:

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM