Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个递归是如何工作的?_Javascript_Function_Recursion - Fatal编程技术网

Javascript 这个递归是如何工作的?

Javascript 这个递归是如何工作的?,javascript,function,recursion,Javascript,Function,Recursion,现在我正在阅读MDN函数部分,我正在阅读这个关于递归的示例,它是: function foo(i) { if (i < 0) //1 return; console.log('begin:' + i); //2 foo(i - 1); //3 console.log('end:' + i); //4 } foo(3); 我的问题是: 在这个意义上,在i=-1之后,函数返回 函数未退出函数并继续到第4行 我是如何再次增加的,

现在我正在阅读MDN函数部分,我正在阅读这个关于递归的示例,它是:

    function foo(i) {
    if (i < 0)      //1
    return;
    console.log('begin:' + i);   //2
    foo(i - 1);   //3
    console.log('end:' + i); //4
}
foo(3);
我的问题是:

在这个意义上,在i=-1之后,函数返回 函数未退出函数并继续到第4行

我是如何再次增加的,我看不到循环或递归 再次增加i的值,使其从0再次记录到3


在内部函数调用的结果出现之前,函数不会终止

1是中止条件,它告诉函数何时停止


2它不增加,它更进一步,因为fooi-1调用的结果就在那里

每当递归发生时,控件始终保持在顶层。因此,尽管函数经过n个内部级别,但来自其中一个内部调用函数的返回语句只会返回到其直接父级

在这种情况下:i=3处于顶层,然后是2,然后是1,然后是0。当返回在i=-1激发时,它被冒泡返回到其父级0。下一次返回将其冒泡到其父级i=2,然后i=3


如果您满意,请将其标记为答案。

您的函数完全按照您的要求执行:

print begin:3
do everything that foo(3-1) does
print end:3
对函数的每次调用都会等待它完成,然后再继续下一行。如果它是相同的函数,那么它是相同的。调用的函数版本与它调用的函数版本不干涉,因此它们是分开的,就像它们是分开的函数一样

想象一下这个功能:

function foo(i) {
    console.log('begin:' + i);  //1
    console.log('end:' + i);    //2
}

现在,第一个console.log可能是一个递归函数。你不知道也不应该知道。它完成了它的工作并返回。你不会质疑为什么它会继续到第2行,所以我猜你给了递归函数更多的神秘感

// foo(3) called
console.log('begin:3');
foo(2)
    console.log('begin:2');
    foo(1)
        console.log('begin:1');
        foo(0)
            console.log('begin:0');
            foo(-1)
                return;
            console.log('end:0');
        console.log('end:1');
    console.log('end:2');
console.log('end:3');
1当i==-1时,函数实际上是带着返回退出的,但随后继续执行父函数中的代码参见第2点

2当您调用foo-1时,您调用return,因此这意味着您返回到父调用方并继续执行以下代码

function foo(i) {
    if (i < 0){      //1
       return;
    }
    console.log('begin:' + i);   //2
       function foo(i-1) {
       if (i-1 < 0){      //3.3.1
          return;
       }
       console.log('begin:' + i-1-1);   //3.3.2
          function foo(i-1-1) {
          if (i-1-1 < 0){      //3.3.1
             return;
          }
          console.log('begin:' + i-1-1);   //3.3.2
          function foo(((i-1) - 1)-1){};   //3.3.3
          console.log('end:' + i-1-1); //3.3.4
          }
       console.log('end:' + i-1); //3.4
       }
    console.log('end:' + i); //4
}
foo3

让我们假装我一直都是3岁

情况就是这样:

进入//2和日志3 进入//3.2和日志2 进入//3.3.2并记录1 进入//3.3.3并执行相同的操作并记录0 因为//3.3.3的参数为0,所以进入想象的//3.3.4并记录为0 进入3.3.4并记录1 进入3.4和日志2 进入4和记录3
可能重复的i-1操作不会改变原始值。Foo3仍然有i=3,foo2仍然有i=2,等等。你需要首先理解递归。你看到这个问题了吗:D
function foo(i) {
    if (i < 0){      //1
       return;
    }
    console.log('begin:' + i);   //2
       function foo(i-1) {
       if (i-1 < 0){      //3.3.1
          return;
       }
       console.log('begin:' + i-1-1);   //3.3.2
          function foo(i-1-1) {
          if (i-1-1 < 0){      //3.3.1
             return;
          }
          console.log('begin:' + i-1-1);   //3.3.2
          function foo(((i-1) - 1)-1){};   //3.3.3
          console.log('end:' + i-1-1); //3.3.4
          }
       console.log('end:' + i-1); //3.4
       }
    console.log('end:' + i); //4
}