JavaScript递归,详细理解

JavaScript递归,详细理解,javascript,recursion,Javascript,Recursion,我无法理解这个递归将如何工作。具体来说,我无法清楚地了解最后一个控制台“end”是如何执行的。请提供指导。请在执行部分帮助我。我不理解它是如何形成输出的 函数fooi{ 如果i

我无法理解这个递归将如何工作。具体来说,我无法清楚地了解最后一个控制台“end”是如何执行的。请提供指导。请在执行部分帮助我。我不理解它是如何形成输出的

函数fooi{ 如果i<0 回来 console.log'begin:'+i; fooi-1; console.log'end:'+i; }
foo3 第一次迭代:foo3所以i=3,然后调用foo2,i=2,然后i=1和i=0。现在叫做foo-1。if条件现在为true,因此它在foo0调用中返回,其中console.log以i=0执行。然后i=1,i=2,i=3

因此,您将有:

begin 3
begin 2
begin 1
begin 0
end 0
end 1
end 2
end 3

第一次迭代:foo3所以i=3,然后调用foo2,i=2,然后i=1和i=0。现在叫做foo-1。if条件现在为true,因此它在foo0调用中返回,其中console.log以i=0执行。然后i=1,i=2,i=3

因此,您将有:

begin 3
begin 2
begin 1
begin 0
end 0
end 1
end 2
end 3
当你调用foo3时,我们看到的是:

begin: 3
begin: 2
begin: 1
begin: 0
end: 0
end: 1
end: 2
end: 3
代码中发生的情况如下:

begin: 3
//foo is called, foo(2)
//start of foo(2)
begin: 2
//foo is called, foo(1)
//start of foo(1)
begin: 1
//foo is called, foo(0)
//start of foo(0)
begin: 0
//foo is called, foo(-1)
//start of foo(-1)
//if statement condition is true, returns, ending the recursion chain
//thread returns back to the foo(0) method, logs i
end: 0
//thread returns back to the foo(1) method, logs i
end: 1
//thread returns back to the foo(2) method, logs i
end: 2
//thread returns back to the foo(3) method, logs i
end: 3
当你调用foo3时,我们看到的是:

begin: 3
begin: 2
begin: 1
begin: 0
end: 0
end: 1
end: 2
end: 3
代码中发生的情况如下:

begin: 3
//foo is called, foo(2)
//start of foo(2)
begin: 2
//foo is called, foo(1)
//start of foo(1)
begin: 1
//foo is called, foo(0)
//start of foo(0)
begin: 0
//foo is called, foo(-1)
//start of foo(-1)
//if statement condition is true, returns, ending the recursion chain
//thread returns back to the foo(0) method, logs i
end: 0
//thread returns back to the foo(1) method, logs i
end: 1
//thread returns back to the foo(2) method, logs i
end: 2
//thread returns back to the foo(3) method, logs i
end: 3
此函数如何执行的说明:

让我们追踪一下调用此方法并将3作为参数传递时发生的情况:

foo(3);
 // (3<0) false, so skip the return
 // Log out: 'begin: 3'
  //foo (2);
  // (2<0) skip return;
  // Log out: 'begin: 2'
    //foo(1);
      // (1<0) skip return;
      // Log out: 'begin: 1'
      //foo(0);
        // (0<0) false, skip return;
        // Log out: 'begin: 0'
        //foo(-1);
        //(-1 < 0) true!!! 
        //return undefined
      // Log out: 'end: 0'
      //return undefined
    //Log out: 'end: 1'
    //return undefined
  //Log out: 'end: 2'
  //return undefined
//Log out: 'end: 3'
<---return undefined
此函数如何执行的说明:

让我们追踪一下调用此方法并将3作为参数传递时发生的情况:

foo(3);
 // (3<0) false, so skip the return
 // Log out: 'begin: 3'
  //foo (2);
  // (2<0) skip return;
  // Log out: 'begin: 2'
    //foo(1);
      // (1<0) skip return;
      // Log out: 'begin: 1'
      //foo(0);
        // (0<0) false, skip return;
        // Log out: 'begin: 0'
        //foo(-1);
        //(-1 < 0) true!!! 
        //return undefined
      // Log out: 'end: 0'
      //return undefined
    //Log out: 'end: 1'
    //return undefined
  //Log out: 'end: 2'
  //return undefined
//Log out: 'end: 3'
<---return undefined


我无法理解console.log'end:'+i语句何时以及如何执行。我会非常感激的。提前谢谢。如果你想对你的问题做进一步的澄清,你可以这样做。如果你在可视化递归如何工作方面有困难,请画一棵树来帮助你,记住我是一个变量的副本,而不是同一个,所以对fooi-1的调用不会改变对控制台调用的i值。log'end:'+i;console.log'end:'+1;当fooi-1返回时调用。请参阅,我无法理解console.log'end:'+i语句的执行时间和方式。我会非常感激的。提前谢谢。如果你想对你的问题做进一步的澄清,你可以这样做。如果你在可视化递归如何工作方面有困难,请画一棵树来帮助你,记住我是一个变量的副本,而不是同一个,所以对fooi-1的调用不会改变对控制台调用的i值。log'end:'+i;console.log'end:'+1;当fooi-1返回时调用。请看我理解上面的部分调用。从解释中我不理解的仍然是控制台是如何执行的。log'end'+I正在执行,我是javascript新手,但我仍然认为,它永远不会执行。我错了,但我还是不明白。你错了。考虑这一点:FoO3打印开始3,然后调用FO2。这意味着foo3仍然没有完成执行!foo3还没有回来!现在执行foo2,然后执行foo1等等,因为if条件为true!如果这是真的,那么当1感谢我现在了解一点的时候。试着看看关于递归的一些东西谢谢我现在了解。我部分了解上面的调用,但从解释中我不了解的仍然是控制台是如何执行的。log'end'+我是javascript新手,但我仍然认为,它永远不会执行。我错了,但我还是不明白。你错了。考虑这一点:FoO3打印开始3,然后调用FO2。这意味着foo3仍然没有完成执行!foo3还没有回来!现在执行foo2,然后执行foo1等等,因为if条件为true!如果它是真的,那么当1感谢时,我现在有点明白了。试着看看关于递归的一些东西谢谢我现在明白了。我仍然不明白线程如何返回到foo0并打印结束:0不要认为调用foo就好像它是方法的结束一样,当你调用foo时,它与调用console.log是一样的,它执行分配给console.log的操作,然后执行下一段代码。在这种情况下,它称自己为。真正解决它你认为计算机会怎么做,你会得到它我仍然不明白,线程如何返回到foo0和打印结束:0不要把调用foo当作方法的结束,当你调用foo时,它与调用console.log是一样的,它执行分配给console.log的操作,然后执行下一段代码。在这种情况下,它称自己为。真的要用你认为计算机会用的方法来完成它,你会得到它的