1.在js中使用递归的时候,有可能会栈溢出,因为浏览器调用栈有上限限制,具体可以用以下代码测出当前浏览器所能用的最大栈的数量
var i = 0;
function recursiveFn () {
i++;
recursiveFn();
}
try {
recursiveFn(); 4
} catch (ex) {
alert('i = ' + i + ' error: ' + ex);
}
2.但是当我们确实有需要用到递归的时候有没有更好的解决办法呢,其实是有的,es6中的一个特性-尾递归就可以很好的解决这个问题,
原理
- 常规递归中,我们是保存整个调用栈,比如A函数里面调用了B函数,B函数又调用了C函数,那么现在调用栈就会是 |C|B|A C,B依次执行完之后才能返回A的值,
- 而尾递归中,我们是复用栈的,比如执行C,B这段之后,执行完C后就会销毁C的内容,B里保存C刚才执行完的值,那么流程就是,先C|B,这样执行后,变成B|A,我们用有限的栈空间完成了递归过程
网友评论