2017-02-18 91 views
-4

我想寫一個函數,當我打電話時返回一個數組數組的平均值(平均值)。這是我迄今爲止的情況,但現在卻無能爲力,因爲這無法奏效。有什麼建議?我的平均功能有什麼問題?在迅速

func average(Array arr: [Int]) -> Int{ 
    var average = 0 
    var counter = 0 
    for i in arr{ 

     average = arr[i] + average 
     counter = counter + 1 
     if(counter == arr.count){ 
      var average = (average/arr.count) 
     } 
    } 
    return average 
} 
+0

是什麼'i'代表什麼? – vacawama

+0

'因爲我在arr'然後'arr [i]'看上去很腥。總體而言,這看起來是計算平均值的最長和最複雜的方式。 – luk2302

+0

你也有2個單獨的變量,稱爲'平均' – vacawama

回答

0

你不需要在每個循環的計數器。 也不能聲明你的平均變量兩次,只是在開始時初始化一次。 嘗試

func average(Array arr: [Int]) -> Int{ 
    var avg = 0 
    var sum = 0 
    for i in arr{ 

     sum = i + sum 

    } 
    avg = sum/arr.count 
    return avg 
} 
+0

謝謝!就是這樣! – BCtopics

2

有兩個問題:

  • for i in arr枚舉陣列元素,不是數組索引。 因此i而不是arr[i]是您想要添加到 運行總和(並且arr[i]可能會因索引超出範圍異常而崩潰)。
  • var average = (average/arr.count)在if-block的範圍內定義了一個局部變量 ,該變量隱藏了具有相同名稱的外部變量。換句話說,該分配不會修改最終從函數返回的變量 average

修復這兩個問題你

其中工程(當然截斷結果的整數 由於使用整數除法):

print(average(arr: [1, 2, 4])) // 2 

功能可以簡化爲

func average(arr: [Int]) -> Int{ 
    var sum = 0 
    for elem in arr { 
     sum += elem 
    } 
    return sum/arr.count 
} 

並進一步到

func average(arr: [Int]) -> Int{ 
    return arr.reduce(0, +)/arr.count 
} 
0

一般來說,你不想整數的平均值,因爲它不是真正的意思。

例如:平均[2,3]將吐出2的整數

,你也可以用減少功能簡化代碼。

var arr: [Double] = [...] 
if arr.count > 0 { 
    arr.reduce(0, +)/Double(arr.count) 
} 

至於你的功能發生,這應該工作

func average(_ arr: [Double]) -> Double { 
    if arr.count == 0 { return 0 } 
    var average = 0.0 
    for i in arr { 
    average += i 
    } 
    return average/Double(arr.count) 
}