// 故意来一次爆栈体验 functionstackOverflow(){ stackOverflow() } stackOverflow() // 结果 VM42:3UncaughtRangeError: Maximum call stack size exceeded at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5) at stackOverflow (<anonymous>:3:5)
add(10) // 10 add(100000) // 提示爆栈 VM505:2UncaughtRangeError: Maximum call stack size exceeded at add (<anonymous>:2:3) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16) at add (<anonymous>:5:16)
递归转循环
大部分递归都可以转为循环实现
1 2 3 4 5 6 7 8 9 10
functionadd(num){ let result = 0 while(num--){ result = result+1 } return result } add(100000) // 正常输出100000 // 100000
蹦床函数
爆栈的核心在于不停的往调用栈塞入函数,那么我们可以想办法每次递归都执行对应函数,避免调用栈增加
对递归改写
1 2 3 4 5
// 每次返回函数 functionadd(num, result=1){ if(num===1) return result return()=>add(num-1, 1+result) }
蹦床函数
1 2 3 4 5 6 7 8 9 10 11
functiontrampoline(fun){ let result = fun() // 循环调用,解决递归问题 while (typeof(result)==='function') { result = result() } return result }
留言
欢迎交流想法。留言会通过 GitHub Issues 保存,首次使用需要登录 GitHub。