2017-10-07 2137 views
-1

我正在嘗試編寫一種計算Scala中給定List中元素平均值的方法。這裏是我的代碼:Scala中計算列表中元素的平均值

def meanElements(list: List[Float]): Float = { 
    list match { 
    case x :: tail => (x + meanElements(tail))/(list.length) 
    case Nil => 0 
    } 
} 

當我打電話meanElements(List(10,12,14))),結果我得到的是比12不同的人能幫忙嗎?

+3

請不要用'Java'標記'scala'問題,它們是完全不同的語言。 – Oleg

回答

0

公式是不正確的,它應該是:

case x :: tail => (x + meanElements(tail) * tail.length)/list.length 

但這種實現是執行了很多部門和乘法。 將平均值的計算分割爲兩步, 首先計算總和 ,然後除以list.length會更好。

也就是說,更多的東西是這樣的:

def meanElements(list: List[Float]): Float = sum(list)/list.length 

哪裏sum是你必須實現一個輔助功能。 如果你不想公開它的實現, 那麼你可以在meanElements的主體中定義它。

scala> def mean(list:List[Int]):Int = 
    | if(list.isEmpty) 0 else list.sum/list.size 
mean: (list: List[Int])Int 

scala> mean(List(10,12,14)) 
res1: Int = 12 

scala> 
+0

如何分兩步進行計算?我用case x :: tail => x + meanElements(tail)替換了匹配的行,這樣我就可以得到總和,但是如何在最後打印出平均值呢?謝謝。 – SidiAli

+0

@SidiAli我加了一個例子,看我更新的帖子 – janos

+0

你可以使用'reduce'來求和。即它可以像'def meanElements(list:List [Float]):Float = list.reduce(_ + _)/ list.length'這樣簡單。 – PH88

1

你可以簡單地做它使用內置的函數(或作爲@ph88指出, 它可以像list.reduce(_ + _)一樣簡單。):

def meanElements(list: List[Float]): Float = list.sum/list.length 
0

這裏是你的代碼更短,更可讀的版本: