【发布时间】:2020-08-25 17:00:52
【问题描述】:
我是一名初学者,正在学习 JS 教程,但在这个递归函数示例中试图理解语句执行的顺序时遇到了困难:
function countup(n) {
if (n < 1) {
return [];
} else {
const countArray = countup(n - 1);
countArray.push(n);
return countArray;
}
}
console.log(countup(5)); // Output is [ 1, 2, 3, 4, 5 ]
我假设,每次到达 const countArray = countup(n - 1); 行时,它都会将执行抛回第 1 行,并减少 n。这将解释从 1 开始向上的输出数组,而 n 正在下降。但在这种情况下,函数不应该只返回空数组 [],因为 n 会降到 1 以下,满足第一个 if 并在任何东西被推入 countArray (else) 之前终止?
**尝试使用谷歌搜索断点以查看实际流程,但只看到它们在非循环中的使用
【问题讨论】:
-
断点就是断点,不管它是否在循环中。
console.log也可以成为你的朋友。但我不确定我是否理解您对正在发生的事情的解释:当countup(n - 1)被击中时,该函数被调用 again 并在输入时使用n的新值。n不会小于一,直到...小于一,例如,第一次,它将是4。 -
IMO 你最好最好用铅笔和纸“玩电脑”——假装你是电脑,写下每一步,并记住执行将在递归调用
countup后立即恢复,每次执行countup。 -
特别注意每次调用时采用的条件分支。例如,对于第一次迭代,采用什么分支?返回了什么?对于第一次迭代,它是立即返回,还是进行递归调用?提示:你的笔/铅笔和纸练习,如果你缩进每个调用,大部分应该看起来像一个反斜杠。
-
const countArray = countup(n - 1);不会将执行返回到第 1 行!它使用n-1再次调用countup,一旦该调用返回,当前调用将继续并返回它自己的值。
标签: javascript recursion breakpoints