1.在js中使用遞歸的時候幔妨,有可能會棧溢出蜘腌,因為瀏覽器調(diào)用棧有上限限制低葫,具體可以用以下代碼測出當(dāng)前瀏覽器所能用的最大棧的數(shù)量
var i = 0;
function recursiveFn () {
i++;
recursiveFn();
}
try {
recursiveFn(); 4
} catch (ex) {
alert('i = ' + i + ' error: ' + ex);
}
2.但是當(dāng)我們確實有需要用到遞歸的時候有沒有更好的解決辦法呢映凳,其實是有的耕渴,es6中的一個特性-尾遞歸就可以很好的解決這個問題,
原理
- 常規(guī)遞歸中,我們是保存整個調(diào)用棧邻吞,比如A函數(shù)里面調(diào)用了B函數(shù)组题,B函數(shù)又調(diào)用了C函數(shù),那么現(xiàn)在調(diào)用棧就會是 |C|B|A C,B依次執(zhí)行完之后才能返回A的值抱冷,
- 而尾遞歸中崔列,我們是復(fù)用棧的,比如執(zhí)行C,B這段之后旺遮,執(zhí)行完C后就會銷毀C的內(nèi)容赵讯,B里保存C剛才執(zhí)行完的值,那么流程就是,先C|B趣效,這樣執(zhí)行后瘦癌,變成B|A,我們用有限的楑尉矗空間完成了遞歸過程