【问题标题】:What's wrong with my average function? in swift我的平均功能有什么问题?迅速
【发布时间】:2017-07-08 05:14:19
【问题描述】:

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

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
}

【问题讨论】:

  • i 代表什么?
  • for i in arr 然后arr[i] 看起来很奇怪。总的来说,这似乎是计算平均值的最长、最复杂的方法。
  • 你还有两个独立的变量,叫做average
  • 这也有助于更好地命名变量。您的两个“平均”变量中的第一个应命名为“sum”,因为它是运行总计,而不是平均值。
  • 另一个错误:Int 数组的平均值可能不是Int。例如average([1,2]) == 1.5

标签: arrays swift function average mean


【解决方案1】:

有两个问题:

  • for i in arr 枚举数组元素,而不是数组索引。 因此 i 而不是 arr[i] 是您想要添加到 运行总和(arr[i] 可能会因 index-out-of-range 异常而崩溃)。
  • var average = (average / arr.count) 定义了一个局部变量 在 if 块的范围内,它隐藏了同名的外部变量。换句话说,该分配不会修改 average 最终从函数返回的变量。

解决这两个问题

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
}

【讨论】:

    【解决方案2】:

    你不需要在每个循环中都有一个计数器。 您也不能两次声明您的平均变量,只需在开始时将其初始化一次。 试试

    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
    }
    

    【讨论】:

      【解决方案3】:

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

      例如:[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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 2018-02-19
        • 2015-05-27
        • 2018-03-22
        • 1970-01-01
        相关资源
        最近更新 更多