CNode

setTimeout的执行效率问题,递归调用适合用setTimeout吗?

问答
Wwwmin发布于9 年前最后回复9 年前5 回复5990 浏览0 收藏

在递归调用时调用次数很大时,会导致堆栈溢出,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)

A
AnzerWall#1·9 年前

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

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

Z
zhanzhenzhen#2·9 年前

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

D
dou4cc#3·9 年前
Z
zhanzhenzhen#4·9 年前

@dou4cc 好像你说得对

N
nullcc#5·9 年前

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

参与回复
登录后即可参与回复。登录