这个递归函数是如何解决的,为什么它会输出它的作用

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

Li3*_*357 6

要了解您必须可视化堆栈.让我带您完成执行过程:

  1. 我们从调用开始foo(3),因此i是3.因为i不小于0,所以记录begin:3.呼叫foo(2)
  2. i现在是2.既然i不小于0,记录begin:2.呼叫foo(1)
  3. i现在是1.因为i不小于0,记录begin:1.呼叫foo(0)
  4. i现在是0.因为i不小于0,记录begin:0.呼叫foo(-1)
  5. i现在是-1.由于i 小于0,我们返回去堆栈.从我们离开的地方继续,第二次登录foo(0):

    console.log('end:' + i);
    
    Run Code Online (Sandbox Code Playgroud)

    end:0记录因为i等于0. foo(0)已经解决,上去堆栈foo(1)

  6. 从第二次登录继续foo(1).end:1记录因为i等于1. foo(1)已经解决,上去堆栈foo(2)
  7. 从第二次登录继续foo(2).end:2记录因为i等于2. foo(2)已解决,上移到堆栈foo(3).
  8. 从第二次登录继续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,然后解决调用.