繁体   English   中英

Javascript数学递归函数优化

[英]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();改进我在这里的代码片段。

以下屏幕截图显示了快速测试,显示我编写的函数 recurse2 是相同的*。 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM