关于JS中的递归示例的初学者问题

问题描述

我是一个初学者,正在阅读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);行时,它都会以递减n的方式将执行返回到第1行。这将解释输出数组从1开始并向上移动,而n则向下移动。但是在那种情况下,函数不应该只返回空数组[],因为n会降到1以下,满足第一个if并在将任何内容压入countArray({{1} })? **尝试使用断点来查看实际流量,但只在非循环中看到了它们的使用

解决方法

我们简单地假设每个函数调用及其所有信息都将存储在堆栈中。请注意,堆栈是LIFO(后进先出)。

因此,在您的代码中,countup(5)将被调用并存储在stack[0]中。

然后在else条件中再次将其称为countup(4)。这将暂停countup(5)的执行,并将countup(4)存储在stack[1]中。

就像这样,直到n<1累加计数将以较低的值被调用并存储在堆栈中。

在所有调用结束时,堆栈就像

 - stack[4]    countup(1)
 - stack[3]    countup(2)
 - stack[2]    countup(3)
 - stack[1]    countup(4)
 - stack[0]    countup(5)

现在将从堆栈弹出。由于堆栈是LIFO,因此将弹出堆栈顶部的元素。弹出表示您正在从堆栈中删除该元素。

countup(1)将首先弹出并完成执行。那就是countArray.push(1)

然后countup(2)将位于堆栈的顶部。 因此,countup(2)被弹出并完成其执行countArray.push(2)

就这样, 弹出countup(3)并完成其执行countArray.push(3)。 弹出countup(4)并完成其执行countArray.push(4)。 弹出countup(5),并完成其执行countArray.push(5)

最后返回整个数组。

*我已经用简单的术语描述了它。幕后的真正执行还有很多事情要做,还有许多其他术语需要了解。 You can check this article that describes how recursion works in JS

,

我不知道您是否熟悉“ spread”语法,但是如果将@charset "UTF-8"; .paragraph { font-size: 50px; line-height: 62px; font-family: 'Amatic SC',cursive; } font-family: 'Amatic SC',cursive; .button { background-color: #4CAF50; /* Green */ border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; } 子句的主体写成简单的话,可能会更容易了解发生了什么:

else

这仅表示它是通过获取return [...countUp(n - 1),n]; 并在最后添加元素countUp(n - 1)而获得的数组。您显示的代码执行相同的操作,只是方式略有不同。希望从此描述中可以很明显地看出该函数为什么要执行它的工作-但是,如果仍然不行,请注意:

  • n为空
  • countUp(0)因此由一个空数组组成,该数组的末尾有一个附加的countUp(1)-因此,单例数组1
  • [1]以上,结尾是countUp(2)2

以此类推。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...