Javascript中的尾递归及其优化
在平时的代码里,递归是很常见的,然而它可能会带来的调用栈溢出问题有时也令人头疼:
我们知道, js 引擎(包括大部分语言)对于函数调用栈的大小是有限制的,如下图(虽然都是很老的浏览器,但还是有参考价值):
为了解决递归时调用栈溢出的问题,除了把递归函数改为迭代的形式外,改为尾递归
的形式也可以解决(虽然目前大部分浏览器没有对尾递归(尾调用)做优化,依然会导致栈溢出,但了解尾递归的优化方式还是有价值的。而且我们可以通过一个统一的工具函数把尾递归转化为不会溢出的形式,这些下文会一一展开)。
在讨论尾递归
之前,我们先了解一下尾调用
,以及 js 引擎如何对其进行优化。
尾调用
当函数a
的最后一个动作是调用函数b
时,那么对函数b
的调用形式就是尾调用
。比如下面的代码里对fn1
的调用就是尾调用: