Arrays 我的平均函数有什么问题?迅速地

Arrays 我的平均函数有什么问题?迅速地,arrays,swift,function,average,mean,Arrays,Swift,Function,Average,Mean,我试图编写一个函数,当我调用它时,它返回一个数字数组的平均值。这是我到目前为止所知道的,但现在我不知道为什么这不起作用。有什么建议吗 func average(Array arr: [Int]) -> Int{ var average = 0 var counter = 0 for i in arr{ average = arr[i] + average counter = counter + 1 if(counte

我试图编写一个函数,当我调用它时,它返回一个数字数组的平均值。这是我到目前为止所知道的,但现在我不知道为什么这不起作用。有什么建议吗

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
}

有两个问题:

因为arr中的i枚举数组元素,而不是数组索引。 因此,我而不是arr[i]是您想要添加到 运行sum和arr[i]可能会因索引超出范围异常而崩溃。 var average=average/arr.count定义一个局部变量 在if块的范围内,它隐藏具有相同名称的外部变量。换句话说,该赋值不会修改 最终从函数返回的平均变量。 解决这两个问题

func average(arr: [Int]) -> Int{
    var average = 0
    var counter = 0
    for elem in arr {
        average = elem  + average
        counter = counter + 1
        if(counter == arr.count){
            average = (average / arr.count)
        }
    }
    return 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
}

在for-each循环中不需要计数器。 此外,您不能两次声明平均变量,只需在开始时初始化一次即可。 试一试


通常你不需要整数的平均值,因为它不是真正的平均值

例:[2,3]的平均值会吐出带整数的2

还可以使用reduce函数简化代码

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)
}

我代表什么?因为我在arr中,然后arr[i]看起来很可疑。总的来说,这是有史以来计算平均值最长、最复杂的方法。你还有两个独立的变量,叫做average。这也有助于更好地命名你的变量。两个平均值变量中的第一个变量应命名为sum,因为它是运行总数,而不是平均值。另一个错误:Int数组的平均值可能不是Int。例如,平均值[1,2]==1.5
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)
}