递归计算调和平均值和几何平均值

时间:2012-08-21 16:16:33

标签: recursion

有没有人有一个很好的例子来说明如何递归地计算谐波平均值和几何平均值。是否可以使用Tail Recursive函数?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用'递归'定义:

G(x1,x2,...,xn) = (x1 * G(x2,...,xn)^(n-1))^(1/n)
H(x1,x2,...,xn) = n / ( 1/x1 + (n-1)/H(x2,...,xn) )

这不是计算均值的有效方法,因为取幂/乘法已经进行了n次。

使用列表作为输入参数(N)的简单python实现:

def G(N):
  if len(N) == 1: return N[0]
  return (N[0] * G(N[1:])**(len(N)-1))**(1/len(N))

def H(N):
  if len(N) == 1: return N[0]
  return len(N) / ( 1/N[0] + (len(N)-1)/H(N[1:]) )

答案 1 :(得分:0)

对于几何平均值,我无法使用@ Ante的方法,因为在我的情况下,1)产品对于浮子来说会变得太小而且2)我无法读取整个系列一次,但我一个接一个地发现价值观。因此,我找不到比使用对数更好的解决方案:

int iCount(0);
float GMeanLog(0);
for (int i=1;i<n;i++)
{
if (iCount > 0)
{
    iGMeanLog = GMeanLog+(log(val[i])-GMeanLog)/iCount;
    iCount++;
}
else
{
    iCount++;
    GMeanLog = log(val[i]);
}
}