利用默认参数优化递归函数

        实际上,尾调用的优化发生在引擎背后,除非你尝试优化一个函数,否则无需思考此类问题。递归函数是其主要的应用场景,此时尾调用优化的效果很显著。请看下面这个阶乘函数


        由于在递归调用前执行了乘法操作,因此当前版本的阶乘函数无法被引擎优化。如果n是一个非常大的数,则调用栈的尺寸就会不断增长并存在最终导致栈溢出的潜在风险。

        优化这个函数,首先要确保乘法不会在函数调用后执行,你可以通过默认参数来讲乘法操作移出return语句,结果函数可以携带着临时结果进入到下一个迭代中,以下这段新代码具有相同的行为,但可以被ES6引擎优化。


        我们利用console.time()方法测试两个函数的运行时间:


        在这个重写后的goo函数中,第二个参数p的默认值是1,我们用它来保存乘法结果,下一次迭代中可以取出它来永不计算,不再需要额外的函数调用。当n>1时,先执行一轮乘法计算,然后将结果传给第二次goo()调用的参数。现在,ES6引擎就可以优化递归调用了。

        当你写递归函数的时候,记得使用尾递归优化的特性,如果递归函数的计算量足够大,则尾递归优化可以大幅提升程序的性能。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值