using System; using System.Linq; struct ShortRateTreeNode { public double DF; public double PU; public double PM; public double PD; public int IU; public int IM; public int ID; public ShortRateTreeNode(double df, double pu, double pm, double pd, int iu, int im, int id) { this.DF = df; this.PU = pu; this.PM = pm; this.PD = pd; this.IU = iu; this.IM = im; this.ID = id; } } class Program { static double[] InduceForward(double[] values, ShortRateTreeNode[] nodes) { Func next = k => values[values.Length / 2 + k]; return nodes .Select(node => (node.PU * next(node.IU) + node.PM * next(node.IM) + node.PD * next(node.ID)) * node.DF) .ToArray(); } static void Main() { var ITERATION = 10000; Func maturityValues = x => Enumerable.Repeat(x, 201).ToArray(); var reversedTree = Enumerable.Range(0, 100) .Reverse() .Select(i => Enumerable.Range(-i, i * 2 + 1) .Select(j => new ShortRateTreeNode(1.0, 1.0 / 6.0, 2.0 / 3.0, 1.0 / 6.0, j + 1, j, j - 1)) .ToArray()) .ToArray(); var result = Enumerable.Range(0, ITERATION) .Select(i => reversedTree.Aggregate(maturityValues(i), InduceForward)[0]) .Max(); Console.WriteLine(result); } }