试图理解递归函数的类似堆栈的行为

时间:2015-05-13 16:46:23

标签: javascript function recursion

我正在阅读关于MDN上的函数的文章,我到达了Recursive部分,但我不明白最后一部分讨论了使用类似堆栈的行为。

例如:

function foo(i) {
  if (i < 0)
    return;
  console.log('begin:' + i);
  foo(i - 1);
  console.log('end:' + i);
}
foo(3);

// Output:

// begin:3
// begin:2
// begin:1
// begin:0
// end:0
// end:1
// end:2
// end:3

在该函数上,我了解显示begin日志的时间,但是当显示end日志时我不知道。有人可以帮我解释一下吗?

3 个答案:

答案 0 :(得分:3)

所以基本上每次调用foo时它都会i-1它保持函数打开,它还没有返回。它继续运行因此,一旦它达到0,最后一个函数调用返回,它就会被调用。一旦发生这种情况,其他foo调用也可以开始完成。他们将从最古老到最新完成。

你可以通过Philip Roberts使用放大镜看到这个可视化。你的例子的Here is a Loupe

答案 1 :(得分:2)

在每个end被调用和处理后,foo(i - 1);就会显示出来。

基本上这个过程是:

1)致电foo(i)
2)呼叫foo(i - 1) n次;
然后,当i到达-1时: 3)最深的堆栈return s 4)console.log('end:' + i) n次,因为它仍然是函数调用的一部分,直到i到达-1;

答案 2 :(得分:2)

查看它的最佳方式可能是“展开”递归并将其写为连续调用序列:

foo(3);
begin:3
        foo(2);
        begin:2
                foo(1);
                begin:1
                        foo(0);
                        begin:0
                                foo(-1);
                                return;
                        end:0
                end:1
        end:2
end:3

'end:'字符串在到达最深递归后打印