[英]Javascript math recursive function optimisation
这就是我所拥有的
let base = 10000 let yearly = 31557600 let apy = 0.09 let loop = 0; let new_base = '0'; function recurse(base){ new_base = base*(1+apy*1/(yearly)); if(loop < 3600){ loop++; return recurse(new_base); } else { return new_base; } } base = recurse(base); console.log(base);
如果我将 3600 更改为一个非常大的数字,我会收到错误:超出最大调用堆栈大小
这对我来说似乎很正常,因为递归操作执行了太多次,
解决方案是什么? 例如,是否可以将递归函数转换为线性函数?
谢谢
好吧,它可以转换为方程,但不能转换为线性方程。
这是方法:
我将基础重命名为 b0,新基础重命名为 b1
b1 = b0 * (1 + (apy/yearly)
在循环增加后,新的基数将被更新,我们将新的 b1 称为 b2:
b2 = b1 * (1 + (apy/yearly))
b2 = b0 * (1 + (apy/yearly))^2
等等..
所以最终的返回值将是:
基数 * (1 + (apy/yearly))^3600
和一般公式将是
base * (1 + (apy/yearly))^n,在你的情况下,n 是 3600。
插入插入的常量将得到 10,000.102669931423184360664719158
如果它解决了您的问题,请记住对此答案进行投票。
你需要递归吗? 不。
function recurse2(base){
new_base = base*(1+apy*1/(yearly));
for(loop = 1; loop < 100; loop++){
new_base = base*(1+apy*1/(yearly));
}
return new_base;
}
你甚至没有尾优化。 这只是一个不断变化的值。 您不需要新的堆栈帧(函数调用)来改变所述值,只需循环它即可。
我是如何达到这个功能的? 试想一下当你传入base
时会发生什么,以及它如何随着每次“递归”而变化。 它只是每次都乘以某个表达式。 所以我们可以循环执行。
您甚至可以使用do {} while();
改进我在这里的代码片段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.