2014-06-07 24 views
2

我有一個數組數組(double),我想在C#中實現一個遞歸方法來使用以下算法計算陣列中給定位置的運行平均值:實現數組均值的遞歸方法的困難

μ N + 1 =(N *μñ)/(N + 1)+ X n + 1個/N

其中μ n + 1個是該位置的平均I對此感興趣, μ 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

備註:通常情況下,一個人不會像上一次檢查一樣,像'n == 0'或'n == 1'一樣...結果代碼對於大多數人來說會更容易閱讀... –

+1

這可能應該是X_ {N + 1} /(N + 1)。但是,爲什麼在這裏使用遞歸呢?它對於處理溢出沒有任何意義,並且會比天真的總結和除法方法慢得多。 –

+0

@ G.Bach - 速度不是問題 - 不是遠射。這是問題的堆棧大小。我試着測量10000雙,遞歸耗時0.9549毫秒。當嘗試20,000個雙打時,我吹了堆。堆棧大小是問題。不是速度。 – Enigmativity

回答

0

您需要定義μ1,無論你的第一平均值的初始值,爲您的算法工作。此外,變量我不參與你的表達,所以它是什麼?由於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-1)替代μ(N + 1)= .. .μn。