javascript - JS中的递归计数达到0后会发生什么?
问题描述
不幸的是,尽管阅读了我在网上找到的内容,但我仍然不明白它是如何工作的。
这是代码:
function countup(n) {
if (n < 1) {
return [];
} else {
const countArray = countup(n - 1);
countArray.push(n);
return countArray;
}
}
console.log(countup(5)); // [ 1, 2, 3, 4, 5 ]
我理解的简单部分是使用 n-1 调用函数直到它达到 0,然后将 [] 推送到 countArray 常量。
但是后来我确实明白它是如何将 1 然后 2,然后 3 等到 countArray const 作为 n = 0 的,然后什么都不会发生,因为不再调用该函数。
有人能帮我吗?
解决方案
由于您没有掌握函数调用的窍门,因此在深入研究递归之前,您必须首先完全理解以下程序。我也添加了完整的评论。在这里,我们从另一个函数调用一个函数。递归也是相同的,但相同的函数被自己调用。所以首先要了解以下内容:-
function function1(a,b)
{
let result1 = function2(a,b);
return result1 + a + b;
}
function function2(a,b){
let result2 = function3(a,b);
return result2 * a * b;
}
function function3(a,b){
let result3 = function4(a,b);
return result3 - a - b;
}
function function4(a,b){return a/b}
console.log(function1(4,2))
// It will work like this :-
/*
function1 gets called with a=2,b=4
function2 gets called with a=2,b=4
function3 gets called with a=2,b=4
function4 gets called with a=2,b=4 and doesn't call anymore function inside. Evaluates a/b = 4/2 = 2 and returns 2 back to point inside function3 where it was called
Now function 3 evaluates 2 - 2 - 4 = -4 and returns -4 back to point inside function 2 where it was called
Now function 2 evaluates -4 * 2 * 4 = -32 and returns -32 back to point inside function 1 where it was called
Now function 1 evaluates -32 + 2 + 4 = -26 and returns -26 back to point where it was called which was inside console.log
*/
让我们采用自下而上的方法(当我们达到返回空数组的基本情况时):-
为了n=0
一个空数组[]
返回到 1 的countArray
位置n
。
所以对于n=1
,[].push(1)
发生了,现在这个数组返回到 2 的countArray
位置n
。
所以对于 n=2,[1].push(2)
发生了,现在这个数组返回到 3 的countArray
位置n
。
这一直持续到n=5
一切开始,这也是您记录最终结果的地方。
症结在于,这一切都是在从上往下而不是从上往下回溯时发生n=0
的n=5
。
以下是可视化(从上到下然后从下到上开始):-
推荐阅读
- python - 我可以使用 Sympy 推导出电报方程吗?
- tensorflow - TensorFlow Hub 模块重用
- python - 如何在 django python 的管理页面中添加一个类?
- mpeg2-ts - mpeg-2 ts PCR 33 位 90 kHz 基础和 9 位 27 MHz 扩展位......这是什么意思?
- angular - 为什么要将“哑”组件提取到 index.ts ngModule 中?
- php - 处理不同的输入日期格式以插入 MySQL
- spring - 从spring创建postgres数据库时关系不存在
- forms - Laravel 集体自定义表单,动作 Controller@update 未定义
- c# - SQL Server(本地数据库)的连接字符串
- appium - com.google.common.collect.Maps$TransformedEntriesMap 无法转换为 org.openqa.selenium.WebElement