我在Javascript Recursion中经历了一些例子。
我在此页面中找到了以下代码:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Recursion
function foo(i) {
if (i < 0)
return;
console.log('begin:' + i);
foo(i - 1);
console.log('end:' + i);
}
foo(3);
代码输出:
// begin:3
// begin:2
// begin:1
// begin:0
// end:0
// end:1
// end:2
// end:3
任何人都可以解释输出(特别是'结束'之后的值)吗?
谢谢!
答案 0 :(得分:1)
end
控制台日志是每个递归调用的完成:
---- Invocation 1 ----
begin:3
---- Invocation 2 ----
begin:2
---- Invocation 3 ----
begin:1
---- Invocation 4 ----
begin:0
end:0
---- Invocation 4 ----
end:1
---- Invocation 3 ----
end:2
---- Invocation 2 ----
end:3
---- Invocation 1 ----
答案 1 :(得分:0)
首先,您从i = 3
开始。要控制台begin: 3
。下一行用i = 2
执行函数并显示begin: 2
等等。如果执行了另一个函数中的函数,则函数的父级可以显示end: i
。但是,当功能end: i
未完成时,您无法看到i - 1
。
更多信息:https://en.wikipedia.org/wiki/Recursion_%28computer_science%29
答案 2 :(得分:0)
要理解这段代码,你需要理解&#34;堆栈&#34;在JavaScript中。查找有关此主题的视频可能会有所帮助。堆栈就像一个&#34;做&#34;名单。无论何时你需要调用一个函数,它都会被放在&#34;来做&#34; list /&#34;调用堆栈&#34;,直到函数完成。函数以两种方式之一完成:一)它返回一些东西或两个)它完全运行到函数内部代码的末尾。
单步执行示例中的代码:
FOO(3);
FOO(2);
FOO(3);
FOO(1);
FOO(2);
FOO(3);
FOO(-1);
FOO(0);
FOO(1);
FOO(2);
FOO(3);
FOO(0);
FOO(1);
FOO(2);
FOO(3);
FOO(1);
FOO(2);
FOO(3);
因此,console.log(&#34; begin:..)语句在你的堆栈上执行,而console.log(&#34; end:..)语句在路上执行堆栈。