Javascript 这个递归是如何工作的?
现在我正在阅读MDN函数部分,我正在阅读这个关于递归的示例,它是: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行 我是如何再次增加的,
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
}