我设计了一个函数来计算列表的平均值。尽管它可以正常工作,但是我认为它可能不是最佳解决方案,因为它需要两个功能而不是一个。是否可以仅使用一个递归函数来完成这项工作?

calcMeanList (x:xs) = doCalcMeanList (x:xs) 0 0

doCalcMeanList (x:xs) sum length =  doCalcMeanList xs (sum+x) (length+1)
doCalcMeanList [] sum length = sum/length

最佳答案

您的解决方案很好,使用两个功能并不比一个功能差。不过,您可以将尾部递归函数放在where子句中。

但是,如果您想一行执行:

calcMeanList = uncurry (/) . foldr (\e (s,c) -> (e+s,c+1)) (0,0)

07-25 20:50