Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现数组均值递归方法时遇到的问题_C#_Arrays_Algorithm_Recursion - Fatal编程技术网

C# 实现数组均值递归方法时遇到的问题

C# 实现数组均值递归方法时遇到的问题,c#,arrays,algorithm,recursion,C#,Arrays,Algorithm,Recursion,我有一个数字数组(double),我想在C#中实现一个递归方法,使用以下算法计算数组中给定位置的运行平均值: µn+1=(n*µn)/(n+1)+Xn+1/n 其中µn+1是我感兴趣的职位的平均值, µn是先前迭代的平均值,Xn+1是阵列的第n个元素 我可以用平均函数和迭代函数,但不能用递归: static double Flow(double[] A, int n) { double U = (A[0] + A[1]) / 2.0; if (n

我有一个数字数组(double),我想在C#中实现一个递归方法,使用以下算法计算数组中给定位置的运行平均值:

µn+1=(n*µn)/(n+1)+Xn+1/n

其中µn+1是我感兴趣的职位的平均值, µn是先前迭代的平均值,Xn+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;
    }
静态双流程(双[]A,整数n)
{
双U=(A[0]+A[1])/2.0;
如果(n==2){返回U;}
如果(n==1){返回[0];}
其他的
{

对于(int i=3;i你需要定义µ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来表示递归算法更方便。

旁注:通常使用最后一个检查来表示递归算法,如
n==0
n==1
。结果代码对大多数人来说更容易阅读…这可能是X{n+1}/(n+1)。不过,你为什么在这里使用递归?它对处理溢出没有任何作用,而且比简单的加和除以n的方法要慢得多。@G.Bach-速度不是问题-不是很长。问题是堆栈大小。我尝试用10000倍的倍数进行测量,递归耗时0.9549毫秒。当尝试g有20000个双倍,我把堆栈搞砸了。堆栈大小是个问题。不是速度。@Enigmativity-你有堆栈问题,因为你使用了错误的语言,因为C#没有优化尾部递归-需要一个这样的语言(F#应该可以工作)…真的,这看起来像是“最短C#递归代码表示数组平均值”的潜在候选而且不是很好,所以问题(即缺少问题部分)-所以当时我对Y-combinator的建议看起来不错。@AlexeiLevenkov-我没有使用错误的语言-问题是关于c#的,这种递归函数很容易破坏堆栈。