c# - 递归 yield (RoR)

标签 c# algorithm math recursion finance

我不知道如何递归计算投资返回率,其中本金是未知的,只有利率和利率的持续时间是已知的。

例如,如果我以 10%(或 0.1)的 yield 投资 2 年,则返回率将等于 0.21(或 21%)。这是非递归计算的,

0.21 = 2 * 0.1 + (0.1 ^ 2)
// or
ror = duration * rate + (rate ^ duration)

由于我可能不想只知道最终的计算结果,而是该投资的断断续续的年份,我必须递归地这样做(例如,如果持续时间是 5 年,我想知道第一次之后的返回率是多少第二年,依此类推)。

由于这是一种算法,因此不需要 C#,但这就是我将使用的编程语言。

最佳答案

递归计算最简单的是1.0+RoR:

double calculateRateOfReturnPlus1(double rate, int periods) {
  if (periods == 0)
    return 1.0;
  return (1.0 + rate) * calculateRateOfReturnPlus1(rate, periods - 1);
}

对于 rate=0.1、periods=2 返回 1.21,对于 rate=0.1、periods=3 返回 1.331。然后您可以减去 1.0 以获得纯 RoR。或者,您可以像这样直接计算 RoR:

double calculateRateOfReturn(double rate, int periods) {
  if (periods == 0)
    return 0.0;
  return (1.0 + rate) * (calculateRateOfReturn(rate, periods - 1) + 1.0) - 1.0;
}

此外,您可以像这样迭代计算 RoR:

double calculateRateOfReturn(double rate, int periods) {
  double RoR = 1.0;
  for (int i = 0; i < periods; i++) {
    RoR = RoR * (1.0 + rate);
  }
  return RoR - 1.0;
}

最后两个函数在 rate=0.1、periods=2 时返回 0.21,在 rate=0.1、periods=3 时返回 0.331。

在实践中,我们可以简单地依赖于 Math.Pow() 函数:

double calculateRateOfReturn(double rate, int periods) {
  return Math.Pow(1.0+rate, periods) - 1.0;
}

关于c# - 递归 yield (RoR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7974665/

相关文章:

c# - 数据库连接是否被 SqlConnection 类的析构函数关闭?

c# - 首先在 EF6 db 中模拟数据库

c# - 扩展方法有什么了不起?

algorithm - 给定具有 3 种颜色顶点的图,找到具有以下条件的最短路径

algorithm - Java中队列实现的最快方法

java - 如何使用 optaplanner 求解非线性约束多变量方程 - Java

c - 双重运算每次在C中产生随机数

C# - 队列和多线程

java - 使用 Union-Find 实现 Karger 最小割算法的问题

java - 查找并表示嵌套的、不相交的多边形之间的区域