我有一个数组(double),我想在C#中实现一个递归方法,使用以下算法计算数组中给定位置的运行平均值:
μ n + 1 =(n *μ n )/(n + 1)+ X n + 1 / n
其中μ n + 1 是我感兴趣的位置的平均值, μ n 是先前迭代的平均值,X n + 1 是数组的第n个元素。
我已经能够使用平均函数和迭代函数但不能递归:
static double Flow(double[] A, int n)
{
double U = (A[0] + A[1]) / 2.0;
if (n == 2) { return U; }
else if (n == 1) { return A[0]; }
else
{
for (int i = 3; i <= n; i++)
{
U = Avg(A, U, i);
}
}
return U;
}
static double Avg(double[] A, double M, int n)
{
double a =(n - 1) * M / (n);
double b = A[n - 1] / (n);
return a + b;
}
答案 0 :(得分:0)
您需要定义μ1,无论您的第一个平均值的初始值是什么,您的算法都可以工作。另外,变量i不参与你的表达,那是什么呢?由于Xn + 1除以n,我认为它不能为零。然后该函数应如下所示:
double Avg(double[] array, int n)
{
if (n = 2)
{
return u1/2+array[2]; //u1 is a set value.
}
return (n-1)*Avg(array, n-1)/n+array[n]/(n-1);
}
最后但并非最不重要的是,在μn= ...μ(n-1)而不是μ(n + 1)= ...μn中表达递归算法更方便。