dwi*_*wix 3 javascript recursion function
我发现自己无法理解这个递归函数的例子:
function foo(i) {
if (i < 0)
return;
console.log('begin:' + i);
foo(i - 1);
console.log('end:' + i);
}
foo(3);
Run Code Online (Sandbox Code Playgroud)
输出是:
begin:3
begin:2
begin:1
begin:0
end:0
end:1
end:2
end:3
Run Code Online (Sandbox Code Playgroud)
我理解正常和嵌套函数是如何工作的,我认为return;这里应该i在低于时退出函数0,所以当i = -1第一个console.log()没有显示时,为什么在foo(-1 - 1)得到输出之后end:0?
要了解您必须可视化堆栈.让我带您完成执行过程:
foo(3),因此i是3.因为i不小于0,所以记录begin:3.呼叫foo(2)i现在是2.既然i不小于0,记录begin:2.呼叫foo(1)i现在是1.因为i不小于0,记录begin:1.呼叫foo(0)i现在是0.因为i不小于0,记录begin:0.呼叫foo(-1)i现在是-1.由于i 是小于0,我们返回去堆栈.从我们离开的地方继续,第二次登录foo(0):
console.log('end:' + i);
Run Code Online (Sandbox Code Playgroud)
end:0记录因为i等于0. foo(0)已经解决,上去堆栈foo(1)
foo(1).end:1记录因为i等于1. foo(1)已经解决,上去堆栈foo(2)foo(2).end:2记录因为i等于2. foo(2)已解决,上移到堆栈foo(3).foo(3).end:3记录因为i等于3. foo(3)已解决,因此调用已完全解决.这将产生:
begin:3 //Step 1
begin:2 //Step 2
begin:1 //Step 3
begin:0 //Step 4
end:0 //Step 5
end:1 //Step 6
end:2 //Step 7
end:3 //Step 8
Run Code Online (Sandbox Code Playgroud)
现在,回答这个问题:
但为什么在foo(-1 - 1)之后我们得到输出结束:0?
我们从不打电话,foo(-1 - 1)因为foo(-1)立即返回 - 这是基本情况.它开始记录的原因end:i,其中i的上升是因为继续执行它离开的地方你递归和调用之前foo(i - 1).因此,它会记录end:i,然后解决调用.
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |