如何解决关于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
以此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。