setTimeout的执行效率问题,递归调用适合用setTimeout吗?
发布于 7 年前 作者 wwmin 5046 次浏览 来自 问答

在递归调用时调用次数很大时,会导致堆栈溢出,window的堆栈空间为1M,调用函数存储参数,变量,返回值等,占用一定空间大量的话导致溢出 我的解决办法用setTimeout 但是…问题出现了,这样会导致计算会明显滞后 function isEven(num){ if(num===0)return console.log(true); if(num===1)return cosnole.log(false); return isEven(Math.abs(num)-2); } isEven(100); //加setTimeout后 function isEven2(num){ if(num===0)return console.log(true); if(num===1)return cosnole.log(false); return setTimeout(()=>isEven2(Math.abs(num)-2)); } isEvent2(100); //时间明显变慢了,猜测是因为用setTimeout导致的. 难道setTimeout的开销挺大的吗?求解释.

5 回复

递归栈溢出的解决办法一般是优化算法或者转化成递推。

计算滞后是肯定的,js每一tick才跑一次setTimeout,100tick可能要差不多+1s,啊不1s+

setTimeout规定貌似是4ms。 如果你真要用异步,可以用Promise、setImmediate或nextTick。 但是。。。关键是你这个不适合用异步。建议改成循环。

虽然ES6标准有说到要支持尾递归,可惜JS很多解释器目前都还不支持尾递归,写成尾递归的方式就不会栈溢出。

回到顶部