生产系统防无限循环:JS递归函数的非递归非while改写及功能解析
原递归函数功能解析
原函数的逻辑拆解:
- 初始化
cur参数为0(如果未传入); - 校验输入:若
n < 2,抛出Invalid input错误; - 当
n等于2时,返回1/2 + cur; - 否则递归调用自身,
n减1,同时将1/(n*(n-1))累加到cur中。
把递归过程转化为数学求和,函数实际计算的是:1/2 + 1/(3×2) + 1/(4×3) + ... + 1/(n×(n-1))
利用分式拆分技巧,每一项1/(k*(k-1))可以拆成1/(k-1) - 1/k,将所有项展开后:(1 - 1/2) + (1/2 - 1/3) + (1/3 - 1/4) + ... + (1/(n-1) - 1/n)
中间的1/2、1/3等项会相互抵消,最终结果简化为1 - 1/n。
总结:这个函数的作用是,当输入n≥2时返回1 - 1/n,输入n<2时抛出无效输入错误。
非递归非循环的实现
基于推导出来的数学公式,直接编写代码即可,完全规避递归和循环带来的风险,代码如下:
function calculate(n) { if (n < 2) { throw new Error('Invalid input'); } return 1 - 1 / n; }
该实现和原递归函数的计算结果完全一致,且不存在递归栈溢出或无限循环的问题,符合生产系统的稳定性要求。
内容的提问来源于stack exchange,提问作者PeterWong
相关产品推荐
相关产品推荐

